Java 泛型语法之间的区别?
Difference between Java generics syntax?
这些方法定义有什么区别?
public <T extends Foo> void loadData(Class<T> p_class);
public void loadData(Class<? extends Foo> p_class);
两个签名都接受完全相同的参数集,因此在这个意义上是等价的。正如评论中所指出的,在第二种情况下,您将无法在方法主体中引用 T
。然而,根据 Effective Java,第二个签名是首选(因为它更短且更清晰)。在那本书中,给出的建议是使用第二个签名,如果方法中需要 T
,则使用带有第一个签名的私有辅助方法。像这样:
private <T extends Foo> void helper(Class<T> p_class) {
// code
}
public void loadData(Class<? extends Foo> p_class) {
helper(p_class);
}
语法用法有所不同,因为第二种方法具有泛型类型参数。
class Bar extends Foo { }
obj.<Bar>loadData(klazz);
这要求 klazz 完全 Class<Bar>
。
这些方法定义有什么区别?
public <T extends Foo> void loadData(Class<T> p_class);
public void loadData(Class<? extends Foo> p_class);
两个签名都接受完全相同的参数集,因此在这个意义上是等价的。正如评论中所指出的,在第二种情况下,您将无法在方法主体中引用 T
。然而,根据 Effective Java,第二个签名是首选(因为它更短且更清晰)。在那本书中,给出的建议是使用第二个签名,如果方法中需要 T
,则使用带有第一个签名的私有辅助方法。像这样:
private <T extends Foo> void helper(Class<T> p_class) {
// code
}
public void loadData(Class<? extends Foo> p_class) {
helper(p_class);
}
语法用法有所不同,因为第二种方法具有泛型类型参数。
class Bar extends Foo { }
obj.<Bar>loadData(klazz);
这要求 klazz 完全 Class<Bar>
。