Java 泛型 T 与对象

2022-08-31 07:18:33

我想知道以下两种方法声明之间有什么区别:

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

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

有没有一些你可以/会用一个而不是另一个做的事情?我无法在此站点的其他地方找到此问题。


答案 1

与上下文隔离 - 没有区别。在两者上,您只能调用 的方法。tobjObject

但是对于上下文 - 如果你有一个泛型类:

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

然后:

Foo newFoo = my.doSomething(foo);

与对象相同的代码

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

两大优势:

  • 无需强制转换(编译器会向您隐藏此内容)
  • 编译时安全有效。如果使用该版本,则无法确定该方法是否始终返回 。如果它返回 ,则在运行时将有一个 。ObjectFooBarClassCastException

答案 2

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

在第二个中,返回的类型将与定义类时给定的类型相同。

Example ex = new Example<Integer>();

在这里,我们指定T的类型,它允许我们对类或方法施加更多约束。例如,我们可以实例化 or,我们知道当我们调用这些方法之一时,我们将得到一个整数或示例实例。LinkedList<Integer>LinkedList<Example>

这里的主要目标是调用代码可以指定类将对其执行操作的对象类型,而不是依靠类型转换来强制执行此目的。

请参阅 Oracle 的 Java Generics*。

*更新了链接。


推荐