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
那么该怎么做呢?还是整个方法以某种方式“闻到”?
有一种方法,但并不完全是一个好方法。您需要创建一个如下方法:
public static <I, O extends I> O toGeneric(I input) {
return (O) input;
}
然后,创建对象:
new PickField<String>(toGeneric(Pick.class));
就像我说的,这不是一个好方法,因为你基本上只是对编译器撒谎,但它是有效的。
这里有各种各样的问题。
首先,正如您指出的,您不能在编译时获得参数化类型的类,因为只有一个类是为泛型类型编译的,而不是为每个给定的类型参数编译一个类(例如< code>Pick
正如你所提到的,参数化PickField
您可以使用运行时习惯用法来推断正确的< code >选择
因此,您可以通过显式强制转换来参数化构造函数调用,如下所示:
new PickField<String>(
(Class<Pick<String>>)new Pick<String>("", String.class).getClass()
);
...它将使用“未选中的强制转换”警告进行编译(
类型安全:来自类的未选中强制转换)
真正的问题可能是为什么您需要知道
Pick
类中类型的
值。
我认为 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);
}
}
更多信息(与主题相关):
我正在尝试验证是否调用了具有以下签名的方法: 嵌套的参数化 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泛型的常规文档。但是我的代码似乎遇到了一些干扰性的挑战,因此很