我有一个课程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;
}
由于没有类型安全的类型转换为泛型类型,因此上面的转换将生成编译器警告,告诉您您的代码可能不是类型安全的。但是,您可以自己分析代码。在这种情况下,
myInstance
,instance
和myType
必须始终共享相同的Class
对象。因为您可以证明代码是类型安全的,所以抑制警告(并添加解释代码为何安全的注释)很重要。您可以证明这是类型安全的:
List<String> stringList = new ArrayList<>();
List<String> myList1 = createInstanceFrom(stringList);
List<Integer> myList2 = createInstanceFrom(stringList);
List myList3 = createInstanceFrom(stringList);
createInstanceFrom
方法-必须-返回与其参数类型相同的对象,因此,带有myList1
的行可以编译,但是带有myList2
的行会生成编译器错误。带有myList3
的行可以编译,但会生成编译器警告,因为再次说明,由于您现在使用的是原始类型,因此编译器无法向您保证此代码是类型安全的。但是,在这里,没有办法证明此代码是安全的(因此应将其重构为更安全的代码)。