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>EParent 绑定,这是一种原始类型。当您访问 entity 的任何方法或字段时,由于它的类型 E 受擦除类型的限制,您将获得 Parent 的擦除类型;特别是 VObject。因此错误。

如果我理解正确的话,你似乎想将 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) {
         ....
      }
}