java - 对象数组未转换为泛型类型

标签 java generics casting

我打算使用链表创建一个简单的字典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

这是我试图实现的接口(interface):

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

我知道我们无法创建泛型数组,但我在将泛型类型转换为 Object 时从未遇到过问题type.和泛型类型有关系吗K延伸Comparable ?我该如何解决这个问题?

最佳答案

尝试如下:

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()) );

关于java - 对象数组未转换为泛型类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12401421/

相关文章:

java - 将节点值更改为二叉树中的高度

java - 二维方 block 游戏 : Each tile as an object impractical?

swift - 从 Numeric generic 返回 Double 的平均值扩展

c++ - 在可变参数中转换特定类型

c++ - 多态性 : Runtime-Casting Pointers

c++ - const_cast<> 在 volatile 上的目的是什么?

java - Axis2:禁用 MustUnderstand header 检查

java - 在Testcontainers中使用自定义DB docker-image

Java 通配符未按预期通过继承传递(意外的通配符捕获)

java - 单独计算每种类型创建的对象的数量