Java 以班级代替班级是一种良好的做法吗<;?扩展对象>;为了避免警告?
在我的代码中的许多地方,我有如下内容:Java 以班级代替班级是一种良好的做法吗<;?扩展对象>;为了避免警告?,java,generics,warnings,raw-types,Java,Generics,Warnings,Raw Types,在我的代码中的许多地方,我有如下内容: public Class mySpecialMethod() { return MySpecialClass.class; } 这导致了警告 类是原始类型。提及 泛型类型类应为 参数化 但是,如果我替换 Class 与 Class是的,完全正确 您需要指定类型。如果不能,则必须指定通配符 进一步阅读:根据您想要实现的目标,您可以更加精确: public Class<MySpecialClass> mySpecialMethod() {
public Class mySpecialMethod() {
return MySpecialClass.class;
}
这导致了警告
类是原始类型。提及
泛型类型类应为
参数化
但是,如果我替换
Class
与
Class是的,完全正确
您需要指定类型。如果不能,则必须指定通配符
进一步阅读:根据您想要实现的目标,您可以更加精确:
public Class<MySpecialClass> mySpecialMethod() {
return MySpecialClass.class;
}
公共类mySpecialMethod(){
返回MySpecialClass.class;
}
这里不是真正的Java程序员,但读了一些关于泛型的好文章
是的,您应该添加一些通配符或确切的类型(Class
)以增加安全性。原因是类是泛型的。因此,删除泛型类型参数后,Class
和Class
是相同的。它们都变成了类
,即所谓的原始类型。这种擦除是在编译时发生的。编译器帮助您进行自动转换的示例(为简洁起见,省略了异常处理):
class-Mine{}
瓦拉级{
公共静态void main(字符串…参数){
{//works.translated to Mine m=(Mine)c.newInstance();
c类=矿山级;
Mine m=c.newInstance();
}
{//不起作用。需要强制转换:Mine m=(Mine)c.newInstance();
Class c=Mine.Class;//也可以是Class或Class
(以及等价的Class,只有在类对象确实不需要表示公共基类或接口时才是正确的做法
而且Class
实际上与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
}
}
}