我了解到,在编译时泛型中,我们对大多数特定类型使用了更改。那么仿制药的好处是什么?
例如以下代码:
int a=1;
double b = 2.1;
printArray(a,b);
public static <E> void printArray(E first , E second);
在编译时E更改为Number(因为int和double的特定父级是Number)
那么当我们可以在此处写Number而不是E时,泛型有什么好处?
答案 0 :(得分:2)
泛型的目的与将泛型参数推断为最特定的类型无关。通用方法的目的是允许您编写一种可以与任何类型一起使用并同时保持类型安全的方法。
您的printArray
方法不仅可以将Number
作为参数,而且可以将String
,SomeClass
,Object
和各种引用类型作为参数。
这时您可能会问:“我们不可以只写Object
作为参数类型吗?”可以肯定的是,类型为Object
时,该参数不仅将接受所有引用类型,而且还将接受原语并将其装箱!因此,在这种特定情况下,您不必使用通用方法。
但是,有时泛型方法会发光。
其中一种情况是方法适用于泛型类型。例如,这是Optional.ofNullable
:
public static <T> Optional<T> ofNullable(T value) {
return value == null ? empty() : of(value);
}
它根据参数是否为null创建一个Nullable<T>
。如果不是通用的,则必须返回Optional<Object>
。每次您要调用get
或orElse
时,都需要将结果转换为所需的类型。如果您在一个强制转换中犯了一个错误,则可能在运行时抛出ClassCastException
。但是使用泛型,编译器会为您检查类型!
这是另一个例子:
public static <T> T first(List<T> list) { return list.get(0); }
如果没有泛型,则必须使用原始类型List
并返回Object
。这又带来了铸造问题,并降低了字体安全性。