它是很好的做法与类<更换类?扩展对象>避免警告?
题
在一堆O”在我的代码的地方,我有这样的事情:
public Class mySpecialMethod() {
return MySpecialClass.class;
}
这导致警告
类是原始类型。引用 泛型类应该是 参数化。
但是,如果我替换
Class
与
Class<? extends Object>
警告消失。
这是简单的做法好,也可能以后会麻烦吗?
解决方案
这只是做正确的事情,如果真的有该类对象需要表示没有共同的基类或接口。
另外Class<?>
是有效相同Class<? extends Object>
。
其他提示
根据您想达到什么,你就可以更精确:
public Class<MySpecialClass> mySpecialMethod() {
return MySpecialClass.class;
}
不是一个真正的Java程序员在这里,但了解一些仿制药好论文。
是的,你应该添加一些通配符或确切类型(Class<MySpecialClass>
)增加安全性。其原因是,类是通用的。所以,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
转换为目标类型。泛型是是否具有U型或在运行时用于与旧的Java版本兼容性原因类型T中使用的相同。
不隶属于 StackOverflow