Java:获取具有泛型参数的类的类
我有一个班级Java:获取具有泛型参数的类的类,java,class,generics,Java,Class,Generics,我有一个班级MyClass 我怎样才能得到它的等级? 我试过: MyClass<GenericArg>.class 当我打电话时,我知道: public class SubClass<myEnum extends Enum<myEnum> extends AbstractClass<myEnum> { public static SubClass<myEnum> getSubClass() { ret
MyClass
我怎样才能得到它的等级?
我试过:
MyClass<GenericArg>.class
当我打电话时,我知道:
public class SubClass<myEnum extends Enum<myEnum> extends AbstractClass<myEnum>
{
public static SubClass<myEnum> getSubClass()
{
return construct(SubClass.class);
}
}
public class SubClass类literalMyClass.class
是非法的,因为它在运行时不存在。Java泛型是通过擦除实现的,因此字节码用于:
MyClass<GenericType1>
MyClass<GenericType2>
MyClass
MyClass
类名
类名
所有共享相同的运行时类对象。因为泛型类文本不是类型安全的,所以得到编译器错误是件好事
Java编译器保证,如果代码编译时没有错误或警告,那么它将是类型安全的。当您收到这个特别的警告时,这是因为Java环境告诉您它不能保证代码的类型安全。在这一点上,您有责任评估代码,并确定您尝试执行的操作是否安全
如果它是类型安全的(且仅当),则应在尽可能短的代码块中应用@SuppressWarnings
注释,并用注释解释代码如何仍然是类型安全的。如果您想不出任何这样的注释,那么您可能希望重构您的设计以实现更好的类型安全性。类literalMyClass.class
是非法的,因为它在运行时不存在。Java泛型是通过擦除实现的,因此字节码用于:
MyClass<GenericType1>
MyClass<GenericType2>
MyClass
MyClass
类名
类名
所有共享相同的运行时类对象。因为泛型类文本不是类型安全的,所以得到编译器错误是件好事
Java编译器保证,如果代码编译时没有错误或警告,那么它将是类型安全的。当您收到这个特别的警告时,这是因为Java环境告诉您它不能保证代码的类型安全。在这一点上,您有责任评估代码,并确定您尝试执行的操作是否安全
如果它是类型安全的(且仅当),则应在尽可能短的代码块中应用@SuppressWarnings
注释,并用注释解释代码如何仍然是类型安全的。如果您想不出任何这样的注释,那么您可能希望重构您的设计以实现更好的类型安全性。我感觉您想要做的是反射式地创建一个类的实例,该类可以是泛型的
这准确吗
出于前面讨论过的所有原因,在Java8中,如果不得到编译器警告,就无法做到这一点,但这并不意味着您的代码不是类型安全的。该警告仅表示它无法保证您的代码是类型安全的。如果您能够向自己证明您的代码是安全的,那么抑制类型安全代码的警告是适当的(并且是有用的)
下面是一个方法示例,该方法创建并返回与所提供参数类型相同的对象:
public static <T> T createInstanceFrom(T myInstance) {
@SuppressWarnings("unchecked")
Class<T> myType = (Class<T>) myInstance.getClass();
T instance = myType.newInstance();
return instance;
}
createInstanceFrom
方法-必须-返回与参数类型相同的对象,因此带myList1
的行会编译,但带myList2
的行会生成编译器错误。带有myList3
的行可以编译,但会生成编译器警告,因为现在您使用的是原始类型,编译器无法向您保证此代码是类型安全的。但在这里,无法证明此代码是安全的(因此应将此代码重构为更安全的代码)。我感觉您要做的是反射式地创建一个类的实例,该类可以是泛型的
这准确吗
出于前面讨论过的所有原因,在Java8中,如果不得到编译器警告,就无法做到这一点,但这并不意味着您的代码不是类型安全的。该警告仅表示它无法保证您的代码是类型安全的。如果您能够向自己证明您的代码是安全的,那么抑制类型安全代码的警告是适当的(并且是有用的)
下面是一个方法示例,该方法创建并返回与所提供参数类型相同的对象:
public static <T> T createInstanceFrom(T myInstance) {
@SuppressWarnings("unchecked")
Class<T> myType = (Class<T>) myInstance.getClass();
T instance = myType.newInstance();
return instance;
}
createInstanceFrom
方法-必须-返回与参数类型相同的对象,因此带myList1
的行会编译,但带myList2
的行会生成编译器错误。带有myList3
的行可以编译,但会生成编译器警告,因为现在您使用的是原始类型,编译器无法向您保证此代码是类型安全的。但是,在这里,没有办法证明此代码是安全的(因此此代码应该被重构为更安全的代码)。您得到的警告是什么?我们不知道您试图实现的是什么,这没有帮助-您是否试图通过特定的类型参数获得MyClass
的Class
引用,或者只是原始类型?不知道您的用例,但是我使用MyClass添加编译时保证T是正确类型的类实例。我在我的帖子中添加了一些信息您得到的警告是什么?我们不知道您试图实现的是什么,这没有帮助-您是否尝试使用特定类型参数获取MyClass
的class
引用,或者只是原始类型?不知道您的用例,但我使用MyClass添加了一个编译时保证T是正确的类实例。我在我的帖子中添加了一些信息。谢谢您的完整回答。这当然不是我所期望的,但是现在,我明白了为什么我不能避免这个警告。非常感谢你的完整回答。这当然不是我所期望的,但是现在,我明白了为什么我不能避免这个警告。