我有一个课程MyClass<GenericArg>
我该如何上课?
我试过了 :

MyClass<GenericArg>.class


而且不会编译。

我尝试了MyClass.class并且它可以编译,但是带有警告,并且我不喜欢警告。是否有可能避免此警告(当然,没有禁止警告!)?

编辑:

我有一个函数Construct(Class myClass),其中T扩展了AbstractClass

在构造方法中,我实例化T并将其返回:

myClass.newInstance();
return myClass;


当我打电话时,我有:

public class SubClass<myEnum extends Enum<myEnum> extends AbstractClass<myEnum>
{
     public static SubClass<myEnum> getSubClass()
     {
          return construct(SubClass.class);
     }
}

最佳答案

我感觉到您想要做的是反射性地创建一个可以通用的类的实例。

这个准确吗?

由于已经讨论了所有原因,因此在Java 8中没有收到编译器警告就无法执行此操作,但这并不意味着您的代码类型不安全。该警告仅表示它不能保证您的代码是类型安全的。如果您能够证明自己的代码是安全的,则适当(且有用)禁止显示类型安全代码的警告。

这是创建和返回与所提供参数类型相同的对象的方法的示例:

public static <T> T createInstanceFrom(T myInstance) {
    @SuppressWarnings("unchecked")
    Class<T> myType = (Class<T>) myInstance.getClass();
    T instance = myType.newInstance();
    return instance;
}


由于没有类型安全的类型转换为泛型类型,因此上面的转换将生成编译器警告,告诉您您的代码可能不是类型安全的。但是,您可以自己分析代码。在这种情况下,myInstanceinstancemyType必须始终共享相同的Class对象。因为您可以证明代码是类型安全的,所以抑制警告(并添加解释代码为何安全的注释)很重要。

您可以证明这是类型安全的:

List<String> stringList = new ArrayList<>();

List<String> myList1  = createInstanceFrom(stringList);
List<Integer> myList2 = createInstanceFrom(stringList);
List myList3 = createInstanceFrom(stringList);


createInstanceFrom方法-必须-返回与其参数类型相同的对象,因此,带有myList1的行可以编译,但是带有myList2的行会生成编译器错误。带有myList3的行可以编译,但会生成编译器警告,因为再次说明,由于您现在使用的是原始类型,因此编译器无法向您保证此代码是类型安全的。但是,在这里,没有办法证明此代码是安全的(因此应将其重构为更安全的代码)。

10-07 12:00
查看更多