Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:获取具有泛型参数的类的类_Java_Class_Generics - Fatal编程技术网

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类literal
MyClass.class
是非法的,因为它在运行时不存在。Java泛型是通过擦除实现的,因此字节码用于:

MyClass<GenericType1>
MyClass<GenericType2>
MyClass
MyClass
类名
类名
所有共享相同的运行时类对象。因为泛型类文本不是类型安全的,所以得到编译器错误是件好事

Java编译器保证,如果代码编译时没有错误或警告,那么它将是类型安全的。当您收到这个特别的警告时,这是因为Java环境告诉您它不能保证代码的类型安全。在这一点上,您有责任评估代码,并确定您尝试执行的操作是否安全


如果它是类型安全的(且仅当),则应在尽可能短的代码块中应用
@SuppressWarnings
注释,并用注释解释代码如何仍然是类型安全的。如果您想不出任何这样的注释,那么您可能希望重构您的设计以实现更好的类型安全性。

类literal
MyClass.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是正确的类实例。我在我的帖子中添加了一些信息。谢谢您的完整回答。这当然不是我所期望的,但是现在,我明白了为什么我不能避免这个警告。非常感谢你的完整回答。这当然不是我所期望的,但是现在,我明白了为什么我不能避免这个警告。