【问题标题】:Object array not getting cast to a generic type对象数组未转换为泛型类型
【发布时间】:2012-09-13 07:28:31
【问题描述】:

我打算使用链表创建一个简单的 Dictionary ADT。我的 getKeys() 方法没有什么问题,这是我的代码:

@Override
public K[] getKeys() 
{
    if(head==null)
    return null;
    else
    {
        Vector<K> v = new Vector();
        ListNode<K,V> temp= head;
        while(temp!=null)
        {
            v.add(temp.key);
            temp=temp.next;
        }
        //K keys[] = new O[v.size()];

        return (K[])v.toArray();//run time error
    }
}

我遇到以下错误:

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Comparable;
    at Dictionary.ListDictionary.getKeys(ListDictionary.java:17)
    at Dictionary.DictionaryDriver.test(DictionaryDriver.java:83)
    at Dictionary.DictionaryDriver.main(DictionaryDriver.java:107)
Java Result: 1

这是我要实现的接口:

public interface DictionaryInterface <K extends Comparable<K>, V>
{
    public void insert(K key, V value);
    public V getValue(K str);
    public void remove(K key);
    public K[] getKeys();   
}

我知道我们不能创建泛型数组,但我从来没有遇到过将泛型类型转换为Objecttype 的问题。它与泛型类型K 扩展Comparable 有关系吗?我该如何解决这个问题??

【问题讨论】:

标签: java generics casting


【解决方案1】:

尝试类似:

return (K[])v.toArray(new Comparable[v.size()]);

不过,附带说明一下,混合泛型和数组并不是最好的主意。


要安全地执行此操作(并且能够接受Comparable 以外的类型),您需要获取类型引用,因此您的构造函数可能如下所示:

public Dictionary(Class<K> keyType) {
    this.keyType = keyType;
}

稍后,在实例化该数组时,调用:

return (K[]) v.toArray( Array.newInstance(keyType, v.size()) );

【讨论】:

  • 当我这样做时,我可以从那一点消除运行时错误,但后来当我使用&lt;String&gt; 创建此类的实例并获得getKeys() 时,我收到此错误@ 987654327@
  • 这就是为什么混合泛型和数组是一个坏主意。您需要对实际类型类的引用才能安全地执行此操作(我将编辑我的答案)。
  • String 实现 Comparable 那么为什么会失败??
  • 我完全没有得到您对答案所做的编辑.. 帮助不大?
  • 它失败了,因为Comparable[] arr = new String[0] 工作正常,但String[] arr = new Comparable[0] 不行。您正在尝试将可比较对象转换为字符串(这是您的实际键类型)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多