gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:22:54 34 4
gpt4 key购买 nike

接受 this question 的答案描述如何创建 T 的实例在 Generic<T>类(class)。这涉及传入 Class<T> Generic 的参数构造函数并调用 newInstance方法由此而来。

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

如果新的Generic的泛型类型参数怎么办?类不是像 Bar 这样的已知类但它本身是泛型类型参数吗?假设我有其他类(class) Skeet<J>我想创建一个 Generic<J> 的新实例从那个类(class)里面。然后,如果我尝试传入 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不允许使用类型参数 - 因为 type erasure , W将被删除Component在运行时。 InputField还需要采取Class<W>来自来电者,例如 InputFieldArray :

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

关于java - 如何从泛型类型参数中获取 `.class` 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18255117/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com