当前位置: 首页 > 面试题库 >

如何从泛型类型参数获取`.class`属性?

庞瀚
2023-03-14
问题内容

该问题的可接受答案描述了如何TGeneric<T>类中创建的实例。这涉及将Class<T>参数传递给Generic构造函数并newInstance从中调用方法。

Generic<Bar>然后创建的新实例,并Bar.class传递参数。

如果新Generic类的泛型类型参数不是某个已知类,Bar但它本身是泛型类型参数,该怎么办?假设我还有其他班级Skeet<J>,我想Generic<J>从该班级内部创建一个新实例。然后,如果尝试传递,则会J.class收到以下编译器错误:

cannot select from a type variable.

有没有办法解决?

对我来说触发错误的代码是:

public class InputField<W extends Component & WidgetInterface>
                                                 extends InputFieldArray<W>
{
  public InputField(String labelText)
  {
    super(new String[] {labelText}, W.class);
  }
  /* ... */
}

public class InputFieldArray<W extends Component & WidgetInterface>
                                                                 extends JPanel
{
   /* ... */
  public InputFieldArray(String[] labelText, Class<W> clazz)
                          throws InstantiationException, IllegalAccessException
  {
    /* ... */

    for (int i = 0 ; i < labelText.length ; i++) {
      newLabel = new JLabel(labelText[i]);
      newWidget = clazz.newInstance();
      /* ... */
    }
    /* ... */
  }
  /* ... */
}

发生错误,是因为我不会写W.class。还有其他传递相同信息的方式吗?


问题答案:

使用.class一个类型参数是不允许的-
因为类型擦除,W将被
清除 ,以Component在运行时。InputField还将需要Class<W>从呼叫者那里收取,例如InputFieldArray

public InputField(String labelText, Class<W> clazz)
{
    super(new String[] {labelText}, clazz);
}


 类似资料:
  • 这个问题的公认答案描述了如何在类中创建的实例。这涉及将参数传递给构造函数,并从中调用方法。 然后创建的新实例,并传入参数。 对我来说,触发错误的特定代码位是: 错误发生,因为我不能编写。还有其他方式传递同样的信息吗?

  • 问题内容: 我刚刚了解了这种美观的语法 用可能是类型的元素来清空。Java的源代码如下所示: 现在,如果我以这种方式编写了一个泛型类型不出现在参数列表中的方法,那么有什么方法可以访问成为的实际类呢? 我的意思是,到目前为止,我编码同一件事的方法是 如果删除了-parameter,我将无法执行。显然我可以 但这给了我通常的警告。好的,在这里有帮助,但是实际上我想对方法的预期返回类型做些事情。如果我添

  • 问题内容: 通常,我见过人们像这样使用类文字: 但是,如果类型是通用类型,例如List,该怎么办?这可以正常工作,但由于应将List参数化,因此发出警告: 那么为什么不添加一个<?>呢?好吧,这会导致类型不匹配错误: 我想像这样的事情会起作用,但这只是一个普通的语法错误: 如何获得Class >静态信息,例如使用类文字? 我可以使用,以摆脱在第一个例子中所造成的非参数使用列表,警告的,但我宁愿不要

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

  • 我在我的一个实用程序类中有一个方法,它接受一个集合和一个类对象,并返回一个Iterable实例,该实例可以遍历作为指定类实例的集合的所有成员。其签名为: 这对于大多数用例都非常有效,但现在我需要将其与泛型类

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