从外部访问List,缺少泛型类型

时间:2014-10-08 21:01:45

标签: java generics

编辑:这是一个Eclipse问题(?)。 Eclipse显示错误但编译它,似乎与Java 8和Type Casting有关。

我的班级有List<E>字段。如果我在课堂内访问它,我会得到List<E> 但是如果我从外部访问List,我只会得到List而没有泛型类型。如果我访问它的元素,我只会获得Object,而不是E 但是在我的代码中我需要显式E,那么如何更改/修复它,以便在不删除泛型且没有显式转换的情况下返回List?

带列表的类:

public class ListClass {

    private List<String> list;

    public ListClass(){

        list = new ArrayList<>();

    }

    public List<String> getList(){
        return list;
    }
}

包含类:

public class ContainingClass {

    private ListClass lc;

    public ContainingClass(){

        lc = new ListClass();
    }

    public ListClass getListClass(){
        return lc;
    }

}

现在出现问题:

    ContainingClass cc = new ContainingClass();

    String str = cc.getListClass().getList().get(0);
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                 Error: "Type mismatch: cannot convert from Object to String"

但为什么?

2 个答案:

答案 0 :(得分:0)

这个答案是指Revision 3

我认为问题是该类应该具有模板参数,而不是方法。

public class X<K, V> {
    private HashMap<K, V> hashMap;

    public X(){
        hashMap = new HashMap<>();
    }

    public HashMap<K,V> getHashMap(){
        return hashMap;
    }
}

答案 1 :(得分:0)

这就是导致问题的原因:

public class X {
    private HashMap<K, V> hashMap;

    public X(){
        hashMap = new HashMap<>();
    }

    public HashMap<K,V> getHashMap(){
        return hashMap;
    }
}

实例化X时,不保留任何参数,因此它是原始类型。

您的解决方法是告诉X在实例化时使用哪些类型的键和值:

public class X<K, V> {
  private HashMap<K, V> hashMap;
  public X(){
    hashMap = new HashMap<>();
  }

  public HashMap<K,V> getHashMap(){
    return hashMap;
  }