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

嵌套泛型继承

钱震博
2023-03-14
class Field<T> {

  private final Class<T> type;

  public Field(Class<T> type) {
    this.type = type;
  }
}

class Pick<V> {
  private final V value;
  private final Class<V> type;

  public Pick(V value, Class<V> type) {
    this.value = value;
    this.type = type;
  }
}

和这个问题相关的课程:

class PickField<T> extends Field<Pick<T>> {

  public PickField(Class<Pick<T>> type) {
    super(type);
  }
}

现在,这似乎已被编译器接受。不幸的是,我不知道/理解如何创建PickField的新实例,例如字符串选择

当然,这确实不起作用:
新的PickField

这是不允许的(我想我知道为什么):< br> new PickField

那么该怎么做呢?还是整个方法以某种方式“闻到”?


共有3个答案

弓俊晖
2023-03-14

有一种方法,但并不完全是一个好方法。您需要创建一个如下方法:

public static <I, O extends I> O toGeneric(I input) {
    return (O) input;
}

然后,创建对象:

new PickField<String>(toGeneric(Pick.class));

就像我说的,这不是一个好方法,因为你基本上只是对编译器撒谎,但它是有效的。

曾修真
2023-03-14

这里有各种各样的问题。

首先,正如您指出的,您不能在编译时获得参数化类型的类,因为只有一个类是为泛型类型编译的,而不是为每个给定的类型参数编译一个类(例如< code>Pick

正如你所提到的,参数化PickField

您可以使用运行时习惯用法来推断正确的< code >选择

因此,您可以通过显式强制转换来参数化构造函数调用,如下所示:

new PickField<String>(
    (Class<Pick<String>>)new Pick<String>("", String.class).getClass()
);

...它将使用“未选中的强制转换”警告进行编译(类型安全:来自类的未选中强制转换)

真正的问题可能是为什么您需要知道 Pick 类中类型的值。

佟云
2023-03-14

我认为 PickField 应该仅使用 Pick 实例进行参数化。

所以这样做应该没问题:

class PickField<T extends Pick<T>> extends Field<T> {

    public PickField(Class<T> c) {
        super(c);
    }
}

然后,您可以用以下代码实例化它:

PickField<SomeSpecificPick> instance = new PickField<>(SomeSpecificPick.class);

其中SomeSpecificPick被定义为:

public class SomeSpecificPick extends Pick<SomeSpecificPick> {

    public SomeSpecificPick(SomeSpecificPick value, Class<SomeSpecificPick> type) {
        super(value, type);
    }
}

更多信息(与主题相关):

    < li >为什么没有用于具体参数化类型的类文本? < li >如何获得泛型类型T的类实例? < li >擦除一般类型
 类似资料:
  • 我正在尝试验证是否调用了具有以下签名的方法: 嵌套的参数化 Set 给我带来了困难。我可以让它使用 any() 匹配器正确验证,如下所示: 如Mockito:使用泛型参数进行验证中所述,尽管令人恼火的是,如果我直接静态导入Matchers,它不起作用。任意,并将其称为: 但是在这种情况下,anyMapOf(clazz,clazz)似乎是更合适的匹配器。既然你不会做Set.class,我不知道你会怎

  • 问题内容: 为什么这样做: 虽然这会产生类型不匹配错误: 为什么是这样?是否有办法解决此问题,而不使用原始类型? 问题答案: 尝试 注意:请注意,当您使用类似List的集合时,您只能在“只读”模式下使用它(添加空值除外)。

  • 给定这样一个类 如何实现可以处理嵌套泛型类型的自定义Kafka反序列化器? 附注:我正在使用jackson进行序列化/反序列化。

  • 问题内容: 这样编译(1.6) 但这不是 的错误 有人可以解释为什么吗?谢谢 编辑:编辑为结果 问题答案: 因为这会破坏类型安全性:

  • 问题内容: 我有三节课: 现在在我的主要职能中,我做这样的事情: 但这会产生2个编译时错误: 无法将A转换为fileHandler 无法将B转换为fileHandler 如果基类不是泛型的,那么我如何摆脱这些错误呢? 更新: 我的班级层次结构是: 调用函数的C类或 调用函数的D类。 C和D都从抽象类E派生。 现在,我应该如何在C和D以及E中定义这些功能: 我给出了以下内容: E: C: D: C,

  • 问题内容: 我有一个(对我而言)复杂的Java泛型问题。我通读了一些文档,并了解了一些,但不是全部。基本上,对我来说,尝试解决它会导致尝试和错误。 在下文中,我给出了代码的精简示例,一次没有任何泛型(这样一个人就可以希望理解我想要实现的目标),而另一个则有一些更接近解决方案的补充。请更正我的第二个版本和/或指向特定的文档。(我有Java泛型的常规文档。但是我的代码似乎遇到了一些干扰性的挑战,因此很