当前位置: 首页 > 知识库问答 >
问题:

Java:使用泛型参数获取类的类

司寇飞航
2023-03-14

我有一个类MyClass

MyClass<GenericArg>.class

而且不编译。

我尝试了MyClass.class,它编译了,但是有警告,我不喜欢警告。有没有可能避免这个警告(当然没有抑制警告!)?

编辑:

我有一个函数构造(类myClass),其中T扩展抽象类

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

myClass.newInstance();
return myClass;

当我打电话时,我有:

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

共有2个答案

秋阳旭
2023-03-14
匿名用户

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

这是准确的吗?

由于已经讨论过的所有原因,在Java8中,如果不得到编译器警告,就不可能做到这一点,但这并不意味着您的代码不是类型安全的。该警告仅表示无法保证您的代码是类型安全的。如果您能够向自己证明您的代码是安全的,那么抑制类型安全代码的警告是适当的(也是有用的)。

下面是一个方法示例,该方法创建并返回与提供的参数类型相同的对象:

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

因为没有类型安全的方法来转换为泛型类型,所以上面的转换将生成一个编译器警告,告诉您您的代码可能不是类型安全的。但是,您可以自己分析代码。在这种情况下,< code>myInstance 、< code>instance和< code>myType必须始终共享同一个< code>Class对象。因为您可以证明代码是类型安全的,所以取消警告(并添加注释解释代码为什么是安全的)非常重要。

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

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

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

< code>createInstanceFrom方法必须返回与其参数类型相同的对象,因此带有< code>myList1的行会编译,而带有< code>myList2的行会生成编译器错误。带有< code>myList3的代码行会编译,但会生成一个编译器警告,因为现在您使用的是原始类型,编译器无法向您保证这段代码是类型安全的。但是,这里没有办法证明这段代码是安全的(因此这段代码应该被重构为更安全的代码)。

毋琪
2023-03-14

类文字 MyClass

MyClass<GenericType1>
MyClass<GenericType2>
MyClass

都共享同一个运行时类对象。因为泛型类文本不是类型安全的,所以得到编译器错误是一件好事。

Java编译器保证您的代码在没有错误或警告的情况下编译时是类型安全的。当您收到这个特定的警告时,是因为Java环境告诉您它不能保证您的代码的类型安全。此时,您有责任评估您的代码并确定您尝试做的事情是否安全。

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

 类似资料:
  • 问题内容: 我有一个抽象类: 我需要充实的孩子-每个孩子都有自己的孩子 我只找到一种解决方案,但需要编译器参数 这是最好的解决方案吗?没有我们可以做同样的事情吗? 问题答案: 实现此目的的类型安全但很简单的方法是传递令牌“编译器可以看到它的位置”: 如果您执行的是未经检查的强制转换,但您“知道自己在做什么”,并且希望编译器停止抱怨,则正确的方法是将非类型安全但您知道它们的工作位本地化。使用: (我

  • 如何获取这个类的类型?对于上下文,我使用ModelMapper,我需要类类型T从S转换为T。 背景: 我已经尝试了N种方法,其中我放置了“//一些方法来获取类型”,但没有任何效果。例如: 或

  • 问题内容: 我有一个列表,程序是这样的:。有什么方法可以使用T变量获取类的名称(因此我可以从内部知道T是否为String,Socket等)? 编辑:没关系,在这里找到了答案。 问题答案: 简短答案 :您不能。 长答案 : 由于使用Java实现泛型的方式,泛型T在运行时不会保留。您仍然可以使用私有数据成员: 用法示例:

  • 问题内容: 我在使用泛型时遇到麻烦。给出以下示例: 什么 ???应该 ? 不工作… 也不。 不工作… 如果有Java泛型专家,我需要帮助…:/ 问题答案: 由于类型擦除,您可能无法获得除外。你将不得不使用不安全的类型转换投下的-具体而言,将做的工作。

  • 问题内容: 我有一个方法以a 作为参数。 在中,我如何知道a 是还是a 是? 问题答案: 根据用户omain的回答“如果使用<?>,则意味着您将不会在任何地方使用参数化类型。要么转到特定类型(在您的情况下,似乎是),要么转到非常通用的“ 另外,我相信如果您使用问号,编译器将在运行时(类型;有效Java的第119页)消除类型不匹配的情况,绕过擦除,并有效地消除了使用泛型类型所带来的好处? 要回答发问

  • 我试图创建一个返回泛型类型参数的方法。 我有一个类车辆订单扩展抽象类订单。在类订单中,我创建了一个抽象方法接收HiredObject。这个方法不会接收任何参数,并将返回一个泛型。 我在VehicleOrder类中实现了这个方法,并将其设置为返回类参数vehicle。 问题是,当我实例化一个新的VeilceOrderorororororororororororororderororororororo