Java:递归泛型编译器错误

时间:2015-01-23 03:07:53

标签: java generics

鉴于以下设想的例子:

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>?如何解决将特定类型映射到其关联字段的问题?

2 个答案:

答案 0 :(得分:5)

如果我正确理解您要执行的操作,您似乎希望将Parent声明为class Parent<E extends Parent<?,V>, V>

它会编译,但不知道这个设计的目的,很难进一步评论它的用处。我的直觉和#34;是你在认真地过度思考......一个直接的想法是为什么不用filterValues而不是整个类来参数化E

class Parent<V> {
     public <E extends Parent<V>> List<V> filterValues(List<E> entities) {
         ....
      }
}

答案 1 :(得分:1)

public class Parent<E extends Parent, V>E绑定Parent,这是一种原始类型。当您访问entity的任何方法或字段时,因为它的类型E受删除类型限制,您将获得Parent的删除类型;特别是VObject。因此错误。