将Object []数组转换为Java中的泛型类型数组时出现ClassCastException

时间:2015-05-07 09:14:03

标签: java classcastexception

您好我对Java非常陌生,在这段代码中,我认为我没有在主要内容中正确创建Bag?请帮助谢谢!

线程中的异常" main" java.lang.ClassCastException:[Ljava.lang.Object;无法转换为[Ljava.lang.Comparable;     中午。(Bag.java:12)     在mid.Bag.main(Bag.java:91)

        public class Bag<T extends Comparable<T>> implements Iterable<T> {
      private int MAX_ITEMS = 10; // initial array size
      private int size;
      private T[] data;

      public Bag( ) {
        data = (T []) new Object[MAX_ITEMS];
        size = 0;
      }

      public void add(T newItem) {
        // check if it's full, then extend (array resizing)
        if (size == data.length) {
          T[ ] temp = (T [ ] ) new Object[data.length*2];
          for (int i = 0; i < size; ++i)
            temp[i] = data[i];
          // reassign data to point to temp
          data = temp;
        }
        // then do the assignment
        data[size++] = newItem; // assign newItem in the next-available slot
      }

public Iterator<T> iterator() {
    return new BagIterator();
  }

 /***************************
  * nested class BagIterator
  ***************************/
   class BagIterator implements Iterator<T> {
    // instance member
    private int index;

    // (0) constructor
    public BagIterator() {
      index = 0;
    }
    // (1)
    public boolean hasNext() {
      return (index < size); // size in the outer Bag<E>
    }
    // (2)
    public T next() {
      /*
      T temp = data[index]; // save the element value
      index++; // increment index
      return temp;
      */
      return data[index++];
    }
      public static void main(String[ ] args) {
          Bag<String> bag1=new Bag<String>();

          bag1.add("good");
          bag1.add("fortune");
          bag1.add("billionarie");
          for (String x: bag1)
              System.out.println(x);

      }

3 个答案:

答案 0 :(得分:7)

是的,您正在创建long double,然后尝试将其强制转换为html .formRowSubmit input[type="submit"] { /*width: 26%;*/ display: inline-block; margin: 5px 0% 5px ; margin-bottom: 10px; height: 25px; border-radius: 3px; outline: 0; -moz-outline-style: none; background: #CAD722; border: none; color: white; font-size: 10px; font-weight: 150; cursor: pointer; transition: box-shadow .4s ease; } ,编译器将其转换为强制转换为Object[](使用原始T[] 1}} type)由于你对T的约束。

阵列和泛型基本上不能很好地协同工作。

Comparable[]字段设为Comparable并在必要时投放单个值可能会更简单。

答案 1 :(得分:2)

下面:

data = (T []) new Object[MAX_ITEMS];

您正构建一个Object数组并尝试将其强制转换为T[]。但是你已声明T继承自Comparable。所以使用:

data = (T []) new Comparable[MAX_ITEMS];

答案 2 :(得分:0)

您也可以重写构造函数:

public Bag(Class<T> c, int s) {
    // Use Array native method to create array of a type only known at run time
    @SuppressWarnings("unchecked")
    final T[] dataArray = (T[]) Array.newInstance(c, s);
    this.data = dataArray;
}

然后你就可以使用它:

Bag<String> bag1 = new Bag<>(String.class,10);

这也应该有效,IMO。在任何情况下,T的实例都必须具有可比性。