【发布时间】:2014-03-13 16:44:00
【问题描述】:
我一直将 java 泛型与现有的集合 API 一起使用,并且知道它提供了编译时类型安全性。
但我对在我的类中使用通配符或有界类型参数感到困惑。当编译器类型擦除实际上用基本类型替换它时,有人可以澄清使用这些的优点。为什么我们不应该将代码指向基类
作为 java 教程中的一个例子 (http://docs.oracle.com/javase/tutorial/java/generics/genMethods.html)
你可以写一个通用的方法来绘制不同的形状:
public static <T extends Shape> void draw(T shape) { /* ... */ }
Java 编译器将 T 替换为 Shape:
public static void draw(Shape shape) { /* ... */ }
那么为什么不直接写取Shape参数,使用通配符或者有界类型有什么好处呢?
【问题讨论】:
-
无,在这种特殊情况下。如果您要返回,比如说,
List<T>,那么情况会有所不同。 -
尝试使用
List<T>和List<Shape>并将List<Circle>传递给这两种方法。 -
有些事情你可以用泛型绑定类型做,而你不能只用基本接口做;例如,您可以专门从方法返回
T类型的对象(否则您将仅限于返回基接口并强制转换为子类)。还有以前的 cmets 所说的,例如List<T>. -
顺便说一句:“Java 编译器将 T 替换为 Shape”。它不是。它用您传递的任何子类型替换它,它只是强制该类型是
Shape的子类型。