通用数组创建和类型参数混淆

时间:2015-03-08 15:37:22

标签: java arrays generics

public interface Pair<K, V>{
  K getKey();
  V getValue();
}

public class OrderedPair<K, V> implements Pair<K, V>{
  private K key;
  private V value;

  OrderedPair(K k, V v){
    key = k;
    value = v;
  }

  public K getKey(){
    return key;
  }

  public V getValue(){
    return value;
  }
}

public class Main{
  public static void main(String[] args){
    OrderedPair<Integer, String> myPair = new OrderedPair<>(100, "Imam Bux");
    OrderedPair<Integer, String> myPair2 = new OrderedPair<>(101, "Pakistan");

    OrderedPair<Integer, String>[] myArray = { myPair, myPair2 };
  }
}

问题:我创建了一个由OrderedPair实现的接口Pair,它由Main类实例化两次。 OrderedPair的键和值是指上面的类型参数?

问题:我想创建OrderedPair数组但最终会出现“泛型数组创建”错误。如果我可以使String [] names = {“ABC”,“DEF”};那么为什么不OrderedPair[]数组?

1 个答案:

答案 0 :(得分:0)

Java的创建者不希望您拥有泛型类型的数组。

请参阅http://docs.oracle.com/javase/tutorial/java/generics/restrictions.html#createArrays

因此,您应该转向Java集合,而不是使用数组;例如,您可能正在使用ArrayList&gt;。

这是由于如何在Java中实现泛型这一事实引起的。添加泛型时,语言设计者决定保证源代码级别的向后兼容性。这个决定有几个后果:

  • 一方面,使用类似ArrayList或Map等类的所有现有Java源代码仍然编译(也产生编译器警告)
  • 另一方面,这种具体实施对仿制药造成严重限制;您不能使用泛型类型创建数组的事实就是其中之一(我建议研究关于该主题的Oracle教程;它真的值得一读)。

ArrayList或其他Collection类型以与泛型兼容的方式重新编写;这对于数组类型来说根本不可能。

对于你的另一个问题:java中没有类似typedef的C ++,所以如果你想避免一直输入OrderedPair,你必须创建一个特定的子类,比如

class MyOrderedPair extends OrderedPair<String, Integer> ...