在一堆O”在我的代码的地方,我有这样的事情:

public Class mySpecialMethod() {
  return MySpecialClass.class;
}

这导致警告

  

类是原始类型。引用   泛型类应该是   参数化。

但是,如果我替换

Class

Class<? extends Object>

警告消失。

这是简单的做法好,也可能以后会麻烦吗?

有帮助吗?

解决方案

这只是做正确的事情,如果真的有该类对象需要表示没有共同的基类或接口。

另外Class<?>是有效相同Class<? extends Object>

其他提示

是的,这是完全正确的。

这是您指定的类型的要求。如果你不能,你必须指定通配符。

进一步阅读: Java语言规范:参数化类型

根据您想达到什么,你就可以更精确:

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中使用的相同。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top