-2

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.HashSet我在行 出现错误: (HashSet<String>) pos[targetPos3]).contains(word)

 public void search(String word, Object[] root){
    int targetPos1;
    int targetPos2;
    Object[] pos = root;

    targetPos1 = word.charAt(0) -'a';
    targetPos2 = word.charAt(1) -'a';
    int targetPos3 = word.charAt(2) - 'a';

    if(root[targetPos1]==null){
        System.out.println("1st letter NOT FOUND");
    }
    else{
         pos = (Object[]) root[targetPos1];
         if(pos[targetPos2]==null){
             System.out.println("2nd letter NOT FOUND");
         }
         else{
             if( ((HashSet<String>) pos[targetPos3]).contains(word)){
                 System.out.println("Word FOUND: " + word);
                 System.out.println(pos[targetPos3]);//output children
             }
             else{
                 System.out.println("NOT FOUND");
             }
         }
    }//end of else

}
4

6 回答 6

1

从您的代码和异常中,实际上您在 pos[targetPos3] 处有一个 Object[]。

您不能将其转换为 HashSet。

于 2013-04-11T09:30:55.113 回答
1

pos是 Object 并且您正在尝试转换它HashSet<String>并且它提出了ClassCastException.

确定pos[targetPos3]不是HashSet.

于 2013-04-11T09:27:53.783 回答
1

给定

Object[] pos = root;

(HashSet<String>) pos[targetPos3]

pos[targetPos3]一定不能是HashSet<String>. 如果不知道 Object[] 数组实际包含什么(为什么它如此不具体?)以及您打算做什么,就不可能进一步回答您的问题。

于 2013-04-11T09:27:58.317 回答
1

请尝试调试代码并检查 word 的数据类型。从错误日志中它显示 word 的数据类型是对象(它可能是 String 或其他)并且您正在尝试将其分配给 HashSet..

于 2013-04-11T09:28:03.770 回答
0

从表面上看,你有一个Object[][]作为root.

您得到其中之一Object[](位于 处的那个targetPos1)。

然后你从中得到一个Object(那个 at targetPos3)。

然后Object,您尝试将其转换为 a HashSet<String>,这将引发 a ClassCastException

从例外情况来看,这Object实际上是另一个Object[][Ljava.lang.Object;不能...),因此您似乎以Object[][][]root身份传入。或者至少第二维数组的一些元素是Object[].

我建议您instanceof在转换之前进行检查,或者最好弄清楚您传入的数据结构实际上是什么,并将其转换为数据传输对象,而不是您不理解的多维数组。

于 2013-04-11T09:32:40.227 回答
0

你不能这样做:

if ((HashSet<String>) pos[targetPos3]).contains(word))

但是你试试这个:

private class ArrayTools
{
    public static<T> boolean contains (T [] array, T key)
    {
        for (T item : array)
        {
            if (item.equals(key))
            {
                return true;
            }
        }
        return false;
    }
}

那么你可以这样做:

if (ArrayTools.contains(pos[targetPos3], word))

注意:您不能将其与原语一起使用。

于 2013-04-11T09:49:35.083 回答