1

泛型数组的问题(即它们的不可能性)对我来说似乎是一个反复出现的主题。下面是一个HashMap数据结构的相关代码。显然,我不能声明 a Bucket[],因为泛型数组是不可能的。但是,我可以声明一个MapThing.Bucket[]. 当我断言这是一种好习惯时,我是否正确,因为即使MapThing.Bucket[]是原始类型声明,实际MapThing.Bucket[]实例也是由其封闭实例类型参数化的?

感谢您的任何见解!

克里斯

public class MapThing<K, V> {
  private Bucket buckets[];

  public static void main(String[] argv) {
    MapThing<String, Integer> thing = new MapThing<>();
    thing.put("got your number", 8675309);
  }

  @SuppressWarnings("unchecked")
  public MapThing() {
    buckets = new MapThing.Bucket[314159];
  }

  public void put(K key, V value) {
    Bucket bucket = new Bucket(key, value);

    // Prints typeof bucket key: String, value: Integer
    System.out.println("typeof bucket key: "
    + bucket.getKey().getClass().getSimpleName() + ", value: "
    + bucket.getValue().getClass().getSimpleName());

    buckets[Math.abs(key.hashCode() % buckets.length)] = bucket;
  }

  private class Bucket {
    private K key;
    private V value;

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

    public K getKey() {
      return key;
    }

    public V getValue() {
      return value;
    }
  }
}
4

1 回答 1

1

显然,我不能声明 Bucket[],因为泛型数组是不可能的。

  1. 您始终可以声明任何数组类型的变量。总是。Bucket[]声明or或其他的变量是完全可以的ArrayList<String>[]

  2. 您不能将数组创建表达式(即new X[...])与参数化类型(即 if Xis Something<SomethingElse>where is where SomethingElseis nothing except ?)一起使用。您可以使用原始类型的数组创建表达式(即原始类型new X[...]在哪里X),例如new ArrayList[10].

    因此,如果Bucket是原始类型,那么new Bucket[10]将非常好。问题是,Bucket它不是原始类型。Bucket是通用外部类中的非静态内部类。这意味着它在其外部类的类型参数范围内。换句话说,如果你在Bucket里面写了不合格的类型MapThing,它就隐含地表示MapThing<K,V>.Bucket,它是一个参数化的类型。

    要获取原始类型,您需要使用外部类明确限定它,如MapThing.Bucket. 所以new MapThing.Bucket[10]会起作用。

    或者,如果您不想使用原始类型,则可以使用所有通配符对其进行参数化:new MapThing<?,?>.Bucket[10].

于 2014-11-17T05:11:15.973 回答