通用方法和非通用方法的区别

3
这两种方法有什么区别?
public <T extends Serializable, Y extends List<T>> void foo(Y y, T t);

并且

public void foo(Serializable ser, List<Serializable> list);

第一个是已经定义好类型的,因此你不需要强制转换其结果。例如,Y y2 = foo(y1, t1); 在第二个例子中是行不通的。你需要这样写:Y y2 = (Y) foo(y1, t1); - Arnaud Denoyelle
@ArnaudDenoyelle 的方法是 void - Sotirios Delimanolis
它允许您使用相同的基类/方法来管理多个对象。一个很好的例子是Java内置接口List<T>,您在示例中使用。 - Mickäel A.
1
@SotiriosDelimanolis 是的,我没有看到那个。因此,我的评论仅适用于该方法返回 T 或 Y 的情况。 - Arnaud Denoyelle
这个例子并不完全正确,因为在第一个方法中使用了 List<T> 而不是 List<Serializable> - Mickäel A.
第一个等同于 public <T extends Serializable> void foo(List<T> y, T t);。因为 Y 只在参数类型中使用了一次,所以它是不必要的。 - newacct
2个回答

5
第一个可以使用List<String>(例如)作为参数调用。第二个不行,因为List<String>不是List<Serializable>
第二个可以用Integer作为第一个参数,并用List<Serializable>作为第二个参数调用。然而,如果另一个参数是Integer,则第一个仅接受List<Integer>作为参数。

3
public <T extends Serializable, Y extends List<T>> void foo(Y y, T t);

该函数中的泛型强制要求您明确指定T类型,并且它在两个参数中必须是完全相同的。子类T不允许,它必须是那个类型。否则编译器将不允许。
public void foo(Serializable ser, List<Serializable> list);

在这个非通用函数中,除了它们都是可序列化的之外,参数类型之间没有任何关系。这允许ser是任何类型的Serializable,而list中的元素可以是任何类型的Serializable。它们可以是相同的类型,也可以不是。编译器不会在意。
对于任何可能正在阅读此内容的新手,以下是更多信息:
泛型只存在于源代码中。一旦代码被编译,它们就不存在了。这被称为“类型擦除”:

https://www.google.com/search?q=type+erasure+java

这种擦除是为了让早期代码能够与泛型代码互操作。因此,早于泛型引入的代码不需要进行更改。鼓励新代码始终使用泛型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接