用Class <! - 替换Class是一种好习惯吗?扩展对象 - >以避免警告?

时间:2008-12-16 06:52:36

标签: java generics warnings raw-types

在我的代码中,我有类似的东西:

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

导致警告

  

Class是原始类型。参考   泛型类应该是   参数化。

但是,如果我替换

Class

Class<? extends Object>

警告消失了。

这个简单的练习可以,或者以后会引起麻烦吗?

4 个答案:

答案 0 :(得分:15)

只有在没有Class对象需要表示的公共基类或接口时,这才是正确的做法。

同样Class<?>实际上与Class<? extends Object>相同。

答案 1 :(得分:6)

是的,这是完全正确的。

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

进一步阅读:Java Language Specification: Parameterized Types

答案 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版本较旧。