3

エラーが発生します:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
at Book.Organizer.Desk.RubCol.BookMainKeeper.main(BookMainKeeper.java:25)

これを修正する方法がわかりません。私が間違っていることを教えてくれる人はいますか?

メイン (BookMainKeeper クラス):

public class BookMainKeeper {

/**
 * @param args
 */
public static void main(String[] args) {

    BagInterface<String> shelf1 = new pileBooks<String>();
    BagInterface<String> shelf2 = new pileBooks<String>();
    BagInterface<String> shelf3 = new pileBooks<String>();

    shelf1.add("Java 3rd Edition");
    shelf1.add("Pre-Calculus 2nd Edition");
    shelf1.add("Lava World");

    String[] check = shelf2.toArray();

    System.out.println(shelf2.toArray());

}}

BagInterfaceを使用するpileBooksクラス:

public class pileBooks<T> implements BagInterface<T> {

private final T[] bag; 
private static final int DEFAULT_CAPACITY = 25;
private int numberOfEntries;

/** Creates an empty bag whose initial capacity is 25. */
public pileBooks() 
{
    this(DEFAULT_CAPACITY);
} // end default constructor

/** Creates an empty bag having a given initial capacity.
@param capacity  the integer capacity desired */
public pileBooks(int capacity) 
{
    numberOfEntries = 0;
    // the cast is safe because the new array contains null entries
    @SuppressWarnings("unchecked")
    T[] tempBag = (T[])new Object[capacity]; // unchecked cast
    bag = tempBag;
} // end constructor

/**gets the current size of the bag
 * @return numberOfEntries
 */
public int getCurrentSize() {
    return numberOfEntries;
}

/** Sees whether this bag is full.
   @return true if this bag is full, or false if not */
public boolean isFull() 
{
    return numberOfEntries == bag.length;
} // end isFull

/**It checks if the bag is empty or not
 * @return True if numberOfEntries equals 0, False if otherwise
 */
public boolean isEmpty() {
    return numberOfEntries == 0;
}

/** Adds a new entry to this bag.
@param newEntry  the object to be added as a new entry
@return true if the addition is successful, or false if not */
public boolean add(T newEntry) 
{
    boolean result = true;
    if(isFull())
    {
        result = false;
    }
    else
    {
        bag[numberOfEntries]= newEntry;
        numberOfEntries++;
    }
    return result;
} // end add

/** Removes one unspecified entry from this bag, if possible.
   @return either the removed entry, if the removal
           was successful, or null */
    public T remove()
    {
        T result = null;
        if(numberOfEntries>0)
        {
            result = bag[numberOfEntries-1];
            bag[numberOfEntries - 1]=null;
            numberOfEntries--;
        }
        return result;
    } // end remove

/** Removes one occurrence of a given entry from this bag.
   @param anEntry  the entry to be removed
   @return true if the removal was successful, or false otherwise */
public boolean remove(T anEntry) 
{
    int index = getIndexOf(anEntry);
    T result = removeEntry(index);
    return anEntry.equals(result);
} // end remove

/**
 * Removes entry by verifying it's index
 * @param index = variable to check, if it is -1, the entry was not found
 * and it will exit, if it is 0 or higher, it means it was found in the bag
 * @return if index is -1, it returns result as null
 * if index is 0 or higher, it will put bag[index] in the variable result
 * and returns result
 */
protected T removeEntry(int index) {
    T result = null;
    int check = numberOfEntries;
    if(index != -1)
    {

        while((index < numberOfEntries) && ((check-1) != numberOfEntries)){



            if(index == (numberOfEntries-1))
            {
                result = bag[numberOfEntries-1];
                bag[numberOfEntries-1] = null;
                numberOfEntries--;
                break;
            }
            else
            {
                result = bag[index];
                bag[index] = bag [numberOfEntries-1];
                bag[numberOfEntries-1] = null;
                numberOfEntries--;
                break;
            }
        }
    }
    return result;
}



/**
 * verfifies if anEntry is inside the bag, if it is found, it assigns
 * i to the variable index
 * @param anEntry = object to search for inside the bag
 * @return index, -1 if anEntry was not found
 * whatever is contained in variable 'i' if it is found
 */
private int getIndexOf(T anEntry) {
    int index=-1;
    for(int i=0;i<bag.length;i++)
    {
        if(anEntry.equals(bag[i]))
        {
            index = i;
            break;
        }
    }
    return index;
}







/** Removes all entries from this bag. */
public void clear() 
{
    while(!isEmpty())
        remove();
} // end clear




/** Counts the number of times a given entry appears in this bag.
 @param anEntry  the entry to be counted
 @return the number of times anEntry appears in the bag */
public int getFrequencyOf(T anEntry) 
{
    int counter = 0;
    for(int index = 0; index < numberOfEntries; index++)
    {
        if (anEntry.equals(bag[index]))
        {
            counter++;
        }
    }
    return counter;
} // end getFrequencyOf






/** Tests whether this bag contains a given entry.
 @param anEntry  the entry to locate
 @return true if this bag contains anEntry, or false otherwise */
public boolean contains(T anEntry) 
{
    boolean found = false;
    for(int index = 0; !found && (index<numberOfEntries); index++)
    {
        if(anEntry.equals(bag[index]))
        {
            found = true;
        }
    }
    return found;
} // end contains






/** Retrieves all entries that are in this bag.
 @return a newly allocated array of all the entries in the bag */
public T[] toArray()
{
    //the cast is safe because the new array Contains null entries
    @SuppressWarnings("unchecked")
    T[] result = (T[])new Object[numberOfEntries];//unchecked cast
    for(int index=0;index < numberOfEntries; index++)
    {
        result[index]=bag[index];
    }
    return result;

} // end toArray
}

pileBooks クラスで使用される BagInterface :

 //An interface that describes the operations of a bag of objects.
 public interface BagInterface<T> {

 /** Gets the current number of entries in this bag.
 @return the integer number of entries currently in the bag */
 public int getCurrentSize();

 /** Sees whether this bag is full.
 @return true if the bag is full, or false if not */
 public boolean isFull();

 /** Sees whether this bag is empty.
 @return true if the bag is empty, or false if not */
 public boolean isEmpty();

 /** Adds a new entry to this bag.
 @param newEntry the object to be added as a new entry
 @ return true if the addition was successful, or false if not */
 public boolean add(T newEntry);

 /** Removes one unspecified entry from this bag, if possible.
 @return either the removed entry, if the removal was successful, or null */
 public T remove();

 /** Removes one occurrence of a given entry from this bag, if possible.
 @param anEntry the entry to be removed
 @return true if the removal was successful, or false if not */
 public boolean remove(T anEntry);

 /** Removes all entries from this bag. */
 public void clear();

 /** Counts the number of times a given entry appears in this bag.
 @param anEntry the entry to be counted
 @return the number of times anEntry appears in the bag */
 public int getFrequencyOf(T anEntry);

 /** Test whether this bag contains a given entry.
 @param anEntry the entry to locate
 @return true if the bag contains anEntry, or false otherwise */
 public boolean contains(T anEntry);

 /** Creates an array of all the entries that are in this bag.
 @return a newly allocated array of all entries in the bag */
 public T[] toArray();


 }// end BagInterface
4

2 に答える 2

1

にキャストできないように、 にキャストObject[]することはできません。おそらく、T 型の実数配列を返す必要があります。String[]ObjectString

これを行う方法?toArray1 つの方法は、配列の型をlikeの引数として追加することです

public T[] toArray(Class<T> clazz) {
    // the cast is safe because the new array Contains null entries
    @SuppressWarnings("unchecked")
    T[] result = (T[]) java.lang.reflect.Array.newInstance(clazz, numberOfEntries);

Tまたは、配列にタイプのオブジェクトのみが含まれ、ある種のようなそのサブタイプが含まれていないことが確実な場合はT1T2次のような格納された要素の1つから読み取ることで配列のタイプを取得できます

T[] result = (T[]) java.lang.reflect.Array.newInstance(
        bag[0].getClass(), numberOfEntries);

T1しかし、必要な型の配列を作成し、代わりにある種の型の配列を作成するリスクを排除できるため、最初の方法の方が優れていると言えますT

于 2013-03-27T20:32:19.017 に答える
0

String 配列ではなく、Object 配列に保存する必要があります。

Object[] check = shelf1.toArray();

System.out.println(check[1].toString());
System.out.println(check[2].toString());
System.out.println(check[3].toString());

版画:

Java 3rd Edition
Pre-Calculus 2nd Edition
Lava World

checkオブジェクトの配列です。Objectクラスは、 を含むすべてのクラスの親クラスですString。実行時にチェックされるため、コードはコンパイルされますが、実行中にエラーが発生します。

于 2013-03-30T15:26:08.887 に答える