在我的代码中,我有类似的东西:
public Class mySpecialMethod() {
return MySpecialClass.class;
}
导致警告
Class是原始类型。参考 泛型类应该是 参数化。
但是,如果我替换
Class
带
Class<? extends Object>
警告消失了。
这个简单的练习可以,或者以后会引起麻烦吗?
答案 0 :(得分:15)
只有在没有Class对象需要表示的公共基类或接口时,这才是正确的做法。
同样Class<?>
实际上与Class<? extends Object>
相同。
答案 1 :(得分:6)
答案 2 :(得分:6)
根据您想要达到的目标,您可以更精确:
public Class<MySpecialClass> mySpecialMethod() {
return MySpecialClass.class;
}
答案 3 :(得分:4)
这里不是Java程序员,但是阅读一些关于泛型的好文章。
是的,您应该添加一些通配符或确切类型(Class<MySpecialClass>
)以增加安全性。原因是Class是通用的。因此,在删除其泛型类型参数后,Class<Bar>
和Class<Foo>
是相同的。它们都变成Class
,即所谓的原始类型。编译时会发生擦除。举例来说明编译器可以帮助您进行自动转换(为简洁起见省略了异常处理):
class Mine { }
class Vara {
public static void main(String... args) {
{ // works. translated to Mine m = (Mine) c.newInstance();
Class<Mine> c = Mine.class;
Mine m = c.newInstance();
}
{ // doesn't work. need a cast: Mine m = (Mine) c.newInstance();
Class c = Mine.class; // also Class<?> or Class<? extends Object>
Object o = c.newInstance(); // but this works. pointing to a Mine
Mine m = (Mine) c.newInstance(); // needs a manual cast
}
}
}
说Class<?>
(和等价的Class<? extends Object>
),你告诉编译器你真的想要一个T
是Object的类,并且不小心使用了raw类型。但它不会添加任何便利演员。所有泛型操作都是为您插入自动强制转换,从Object
强制转换为目标类型。无论是与U类一起使用还是在运行时使用类型T,泛型都是相同的,出于兼容性原因,Java版本较旧。