Java 泛型 T 与对象
我想知道以下两种方法声明之间有什么区别:
public Object doSomething(Object obj) {....}
public <T> T doSomething(T t) {....}
有没有一些你可以/会用一个而不是另一个做的事情?我无法在此站点的其他地方找到此问题。
我想知道以下两种方法声明之间有什么区别:
public Object doSomething(Object obj) {....}
public <T> T doSomething(T t) {....}
有没有一些你可以/会用一个而不是另一个做的事情?我无法在此站点的其他地方找到此问题。
与上下文隔离 - 没有区别。在两者上,您只能调用 的方法。t
obj
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
这里的区别在于,在第一个中,我们指定调用方必须传递一个 Object 实例(任何类),并且它将取回另一个 Object(任何类,不一定是同一类型)。
在第二个中,返回的类型将与定义类时给定的类型相同。
Example ex = new Example<Integer>();
在这里,我们指定T的类型,它允许我们对类或方法施加更多约束。例如,我们可以实例化 or,我们知道当我们调用这些方法之一时,我们将得到一个整数或示例实例。LinkedList<Integer>
LinkedList<Example>
这里的主要目标是调用代码可以指定类将对其执行操作的对象类型,而不是依靠类型转换来强制执行此目的。
请参阅 Oracle 的 Java Generics*。
*更新了链接。