Java: 递归泛型编译器错误
Java: Recursive generics compiler error
给出以下人为的示例:
public class Child extends Parent<Child, String> () {}
public class Parent<E extends Parent, V> {
public V value;
// maps <List of Entities> to <List of Values>
public List<V> filterValues(List<E> entities) {
List<V> values = new ArrayList();
for (E entity : entities) {
values.add(entity.value); // compiler error: add(V) cannot be
// applied to (java.lang.Object)
}
return values;
}
}
我不完全理解这个错误的性质。 List<V>
是否解析为 List<Object>
?如何解决将特定类型映射到其关联字段的问题?
public class Parent<E extends Parent, V>
将 E
与 Parent
绑定,这是一种原始类型。当您访问 entity
的任何方法或字段时,由于它的类型 E
受擦除类型的限制,您将获得 Parent
的擦除类型;特别是 V
是 Object
。因此错误。
如果我理解正确的话,你似乎想将 Parent
声明为 class Parent<E extends Parent<?,V>, V>
。
它会编译,但不知道这个设计的目的,很难进一步评论它的用处。我的 "gut feeling" 是你严重想多了......一个直接的想法是为什么不用 E
而不是整个 class:
参数化 filterValues
class Parent<V> {
public <E extends Parent<V>> List<V> filterValues(List<E> entities) {
....
}
}
给出以下人为的示例:
public class Child extends Parent<Child, String> () {}
public class Parent<E extends Parent, V> {
public V value;
// maps <List of Entities> to <List of Values>
public List<V> filterValues(List<E> entities) {
List<V> values = new ArrayList();
for (E entity : entities) {
values.add(entity.value); // compiler error: add(V) cannot be
// applied to (java.lang.Object)
}
return values;
}
}
我不完全理解这个错误的性质。 List<V>
是否解析为 List<Object>
?如何解决将特定类型映射到其关联字段的问题?
public class Parent<E extends Parent, V>
将 E
与 Parent
绑定,这是一种原始类型。当您访问 entity
的任何方法或字段时,由于它的类型 E
受擦除类型的限制,您将获得 Parent
的擦除类型;特别是 V
是 Object
。因此错误。
如果我理解正确的话,你似乎想将 Parent
声明为 class Parent<E extends Parent<?,V>, V>
。
它会编译,但不知道这个设计的目的,很难进一步评论它的用处。我的 "gut feeling" 是你严重想多了......一个直接的想法是为什么不用 E
而不是整个 class:
filterValues
class Parent<V> {
public <E extends Parent<V>> List<V> filterValues(List<E> entities) {
....
}
}