【问题标题】:Creating an array of ArrayList which store object of Generic type创建一个 ArrayList 数组,其中存储 Generic 类型的对象
【发布时间】:2017-05-10 17:06:34
【问题描述】:

我必须创建一个 ArrayList 数组来存储泛型类型的对象。

ArrayList<Entry>[] bucket;

当我将其初始化为

bucket=(ArrayList<Entry>[])new Object[m];

我在运行时得到 java.lang.ClassCastException

Entry 类使用泛型。下面是代码:

class Entry<K,V>{
    K key;
    V value;

    public Entry(K key,V value){
        this.key=key;
        this.value=value;
    }

在阅读了几篇关于为什么 Array of Objects 不能转换为泛型类型的 ArrayList 的帖子之后,我明白了我的问题。但是我无法解决这个问题来解决我的特殊情况。

涉及的一些解决方案:

改变它 FROM "一个 ArrayList 的数组" TO "一个 ArrayList 的 ArrayList",
但就我而言,我不能这样做。

完整代码:

import java.util.ArrayList;
class MyHashMap<K,V>  {

    int m;
    int loadFactor;
    int n;

    ArrayList<Entry>[] bucket;

    public MyHashMap(){
        this(10,2);
    }
    public MyHashMap(int m){
        this(m,2);
    }
    public MyHashMap(int m,int loadFactor){
        this.m=m;
        this.loadFactor=loadFactor;
        n=0;

        bucket=(ArrayList<Entry>[])new Object[m];

    }

    class Entry{
        K key;
        V value;

        public Entry(K key,V value){
            this.key=key;
            this.value=value;
        }

        public int hashCode(){
            return 0;
        }
    }


    public void put(K key, V value){    
        Entry entry=new Entry(key,value);
        int hash=entry.hashCode();
        int index=hash%m;
        bucket[index].add(entry);
    }

    public static void main(String[] args) {
        MyHashMap hashMap=new MyHashMap();

        hashMap.put("faisal",2);
    }
}

【问题讨论】:

  • 为什么要创建一个名为 Entry 的类,它看起来与 Java 的 Map.Entry 非常相似?
  • 为什么你认为可以将Object 数组转换为ArrayList&lt;Entry&gt; 数组?
  • 请在您计划使用此ArrayList的上下文中显示代码。
  • 多态类型声明不适用于集合。类型应该是精确类型。它不能是父类型或子类型。但这与数组不同。Entry[] bucket=new Object[m];
  • @Tim 我实际上是在这里实现 HashMap,并且我正在使用链接。

标签: java arrays generics arraylist


【解决方案1】:

只有当它持有的实际对象是一个数组列表时,对象才能被转换为 ArrayList。即让我们看看下面的代码,

Object obj = new ArrayList<String>();   // object variable holding array list type.
ArrayList<String> arr = (ArrayList<String>) obj;

【讨论】:

  • 问题是关于数组列表的数组
【解决方案2】:

您不能创建泛型类型的数组。改用这个:

ArrayList<Entry>[] bucket = new ArrayList[m];

它会显示未经检查的警告,您可以像这样使用@SuppressWarnings("unchecked") 来抑制它:

@SuppressWarnings("unchecked")
ArrayList<Entry>[] bucket = new ArrayList[m];

【讨论】:

  • 编译器没有报错,运行时也没有任何问题。我现在想知道这样做是否可以。!我的意思是这是唯一的选择。
  • 如果您知道您将只在其中存储 ArrayList 对象,则可以这样做。最好不要在 API 类之外公开它。
猜你喜欢
  • 1970-01-01
  • 2014-06-17
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
  • 2018-10-31
相关资源
最近更新 更多