Java 泛型 T 与对象

我想知道下面两个方法声明之间的区别:

public Object doSomething(Object obj) {....}


public <T> T doSomething(T t) {....}

有没有什么东西你可以用一个来做,但是不能用另一个?我在这个网站的其他地方找不到这个问题。

95374 次浏览

与上下文隔离-没有区别。在 tobj上,你只能调用 Object的方法。

但是如果你有一个泛型类:

MyClass<Foo> my = new MyClass<Foo>();
Foo foo = new Foo();

然后:

Foo newFoo = my.doSomething(foo);

对象的代码相同

Foo newFoo = (Foo) my.doSomething(foo);

两个好处:

  • 不需要强制转换(编译器对您隐藏了这一点)
  • 编译工作的时间安全。如果使用 Object版本,则不能确保该方法始终返回 Foo。如果它返回 Bar,那么在运行时就会有一个 ClassCastException

您不需要进行额外的类转换。在第一种情况下,您总是会得到一个 java.lang 类的对象。对象,您需要将该对象强制转换为您的类。在第二种情况下,T 将被替换为在泛型签名中定义的类,并且不需要类强制转换。

在运行时,什么都没有。但是在编译时,第二个例子会进行类型检查,以确保参数的类型和返回值的类型匹配(或者是子类型) ,不管 T 是什么类型(第一个例子也进行类型检查,但是每个对象都是 Object 的子类型,所以每个类型都会被接受)。

T 是一个泛型类型。这意味着它可以在运行时被任何符合条件的对象替换。您可以调用以下方法:

String response = doSomething("hello world");

或者

MyObject response = doSomething(new MyObject());

或者

Integer response = doSomething(31);

如您所见,这里存在多态性。

但是如果它声明为返回 Object,那么除非您键入强制类型转换的内容,否则不能执行此操作。

这里的区别在于,在第一种情况下,我们指定调用方必须传递一个 Object 实例(任何类) ,并且它将返回另一个 Object (任何类,不一定是相同类型的)。

在第二种情况下,返回的类型将与定义类时给定的类型相同。

Example ex = new Example<Integer>();

这里我们指定哪种类型的 T 将允许我们对类或方法强制更多的约束。例如,我们可以实例化一个 LinkedList<Integer>LinkedList<Example>,我们知道当我们调用这些方法之一时,我们将返回一个 Integer 或 Sample 实例。

这里的主要目标是,调用代码可以指定类将操作哪种类型的对象,而不是依赖类型强制转换来实现这一点。

请参阅 Oracle 的 Java 泛型 * 。

* 更新连结。

在第一种情况下,它接受任何类型的参数 e.g.string 并返回一个类型 foo。在第二种情况下,它接受 foo 类型的参数并返回 foo 类型的对象。

不同之处在于,使用泛型方法时,我不需要强制转换,如果我做错了,就会得到一个编译错误:

public class App {


public static void main(String[] args) {


String s = process("vv");
String b = process(new Object()); // Compilation error
}


public static <T> T process(T val) {


return val;
}
}

使用我总是需要强制转换的对象,当我做错时不会得到任何错误:

public class App {


public static void main(String[] args) {


String s = (String)process("vv");
String b = (String)process(new Object());
}


public static Object process(Object val) {


return val;
}
}

在 Java 中,可以考虑泛型优于对象类型的原因有几个:

  1. 泛型是灵活和安全的。同时,使用需要类型强制转换的 Object 容易出错
  2. Java 中的类型转换很慢 Ref: [1] : < a href = “ https://www.infoworld.com/article/2076555/java-Performance-program--part-2-the-Cost-of-casting.html”rel = “ nofollow norefrer”> https://www.infoworld.com/article/2076555/java-performance-programming——part-2——the-cost-of-casting.html