为什么我不能将一个泛型类型参数添加到ArrayList中?

时间:2016-02-04 20:36:32

标签: java generics exception arraylist casting

第一条评论行上面的代码显示“城市无法转换为T”。所以在下一行,我把它输给了T. 在主程序中编译方法“testing”之后,它抛出了这个异常:“线程中的异常”main“java.lang.ClassCastException:[Ljava.lang.Object;不能转换为[Lapi.xapi.City;”

任何人都可以解释为什么会发生这种情况并在可能的情况下获得解决方案吗?

提前致谢。

顺便说一句,我需要在MyMap类中使用City类的一些方法,如果没有别的办法,我只能使用强制转换。

init-declarator

----------------------------------------------- -------------------------------------------

信息更新:抱歉缺少信息。

这是超类DirectedGraph:

public class MyMap <T extends City> extends DirectedGraph<City> {

    public void add(T vertex) {
      super.addVertex(vertex);
    }

    public void testing(T vertex) {
      ArrayList<T> x = new ArrayList<>();
    //x.add(super.vertices[0]);        
      x.add((T) super.vertices[0]);
    } 
}

2 个答案:

答案 0 :(得分:1)

你对城市的子类型有限制,我猜测super.vertices要么返回一个超级类型的城市或对象。 通过转换为T,你告诉编译器“相信我,我知道它是城市的子类型”

答案 1 :(得分:1)

请考虑将一些更正作为对您的问题的评论发布。

我认为主体看起来像这样:

public static void main(String args[]) {
  new MyMap<City>().testing(new City());
}

然后,至于为什么&#39;施放到T失败&#39;:

当您实例化new MyMap<City>()时,它会有效地尝试创建City [],但您可以为其分配Object []。编译器允许这样做,因为使用泛型和类型擦除,此时没有任何错误。编译器还不知道它可以获得除Object []以外的任何其他内容。

可以提供几种解决方案,如果您不应该将应用程序的设计带回绘图板,并且重新考虑,那么所有解决方案都会受到质疑。然而,这些是一些选择:

你必须以某种方式以某种方式传递类型。这可以通过传递T类,T的实例或预先存在的T数组来实现。我提供了第二个解决方案,它将使初始化看起来如下:

  public DirectedGraph(Class<? super T> class) {
      this.vertices = (T[]) Array.newInstance(clazz, DEFAULT_CAPACITY);
      this.edges = new double[DEFAULT_CAPACITY][DEFAULT_CAPACITY];
  }

然后对于MyMap,由于父项中的默认构造函数已经进入DirectedGraph(我们添加了一个参数),您必须在MyMap中添加一个:

  public MyMap() {
    super(City.class);
  }

通过这些代码更改,我更进了一步。但是因为我对初始化的逻辑不完整,或者因为它有其他问题,所以会弹出下一个不相关的错误。

我想关注以下帖子: