繁体   English   中英

为什么我不能将通用类型参数添加到ArrayList中?

[英]Why cant i add a generic type parameter into an ArrayList?

下面第一行注释中的代码显示“城市无法转换为T”。 因此,在下一行中,我将其强制转换为T。在主程序中编译方法“ testing”后,它将引发以下异常:“线程“ main”中的异常java.lang.ClassCastException:[Ljava.lang.Object;不能是强制转换为[Lapi.xapi.City;“

谁能解释为什么会这样,并在可能的情况下找到解决方案?

提前致谢。

顺便说一句,我需要从MyMap类中的City类访问一些方法,并且我只能在没有其他方法的情况下使用强制类型转换。

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]);
    } 
}

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

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

这是超类DirectedGraph:

public class DirectedGraph<T>{

protected final int DEFAULT_CAPACITY=15;
protected T[] vertices;
protected double[][] edges;
protected int numVertices;

public DirectedGraph() {
    this.vertices = (T[]) (new Object[DEFAULT_CAPACITY]);
    this.edges = new double[DEFAULT_CAPACITY][DEFAULT_CAPACITY];
}

public void addVertex(T vertex) {
    this.vertices[this.numVertices] = vertex;
    this.numVertices++;
}
}

您将T限制为City的子类型,我猜测super.vertices返回的是City或Object的超级类型。 通过强制转换为T,您告诉编译器“相信我,我知道它是City的子类型”

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

我假设主体看起来像这样:

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

然后,关于“向T广播失败”的原因:

实例化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);
  }

通过这些代码更改,我只走了一步。 但是,由于我的初始化逻辑不完整,或者由于它具有其他问题,因此会弹出下一个无关的错误。

我想链接以下帖子:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM