Java:通用阵列创建

时间:2017-01-06 12:34:24

标签: java

我正在编写自定义Map,它有自定义Pair数组,Map使用该对进行操作。

它们是通用的,我不知道它们的类型可以是整数,字符串或双精度。所以我不能使用ArrayList,这对我来说是禁止的。

public class FMap<K, V> {
   private FPair<K, V>[] data;
   int capacity=23;
   int used=0;

   public FMap(int cap){
      super();
      capacity=cap;
      used =0;
      data = new FPair[ capacity];
      for(int i=0; i< data.length; ++i)
          data[i] = new FPair<K, V>();
}

但是编译器说:

javac -g -Xlint BigramDyn.java
./TemplateLib/FMap.java:23: warning: [rawtypes] found raw type: FPair
        data = new FPair[capacity];
                   ^
  missing type arguments for generic class FPair<A,B>
  where A,B are type-variables:
    A extends Object declared in class FPair
    B extends Object declared in class FPair
./TemplateLib/FMap.java:23: warning: [unchecked] unchecked conversion
        data = new FPair[capacity];
               ^
  required: FPair<K,V>[]
  found:    FPair[]
  where K,V are type-variables:
    K extends Object declared in class FMap
    V extends Object declared in class FMap
2 warnings

如果我使用data = new FPair<K, V>[capacity]代替data = new FPair[capacity]

编译器说:

TemplateLib/FMap.java:23: error: generic array creation
        data = new FPair<K,V>[capacity];
               ^
1 error

-

与地图的功能相同: 我正在做: FMAP

FMap<K,V> otherPair = (FMap<K,V>) other;

但是编译器说:

./TemplateLib/FMap.java:34: warning: [unchecked] unchecked cast
            FMap<A,B> otherPair = (FMap<A,B>) other;
                                                ^
  required: FMap<A,B>
  found:    Object
  where A,B are type-variables:
    A extends Object declared in class FMap
    B extends Object declared in class FMap
1 warning

2 个答案:

答案 0 :(得分:0)

您不能拥有泛型类型的数组。

只需要一个非泛型等价物的数组(就像你说的那样),并在需要时使用它们进行投射。

FMap[] myArray = something;

....

@SuppressWarnings("unchecked")
FMap<K, V> myGenericElement = (FMap<K, V>) myArray[index];

或者您可以继续使用非通用版本。

演员表应该没问题,只需加上@SuppressWarnings("unchecked")。在您执行此操作之前,您应该能够证明Object属于FMap类型(这可能很困难,如果我new FMap<Integer, String>().equals(new FMap<Double, Character>())怎么办?)

您的另一个选择是转而使用FMap

答案 1 :(得分:0)

使用ArrayList:

List<FPair<K, V>> data = new ArrayList<>(capacity);

当ArrayList包装数组时,您可以轻松获得List和数组的功能。

只有在有数据时才填写项目,没有new FPair<K, V>();

不允许使用ArrayList:

    data = (FPair<K, V>[]) new FPair<?, ?>[10];

<?, ?><Object, Object>将满足编译器(不再使用原始类型FPair )。滥用/演员是不吉利的。但是当剥离类型时,没有实际的区别。

如果您想填写每个项目(不建议):

    Arrays.fill(data, new FPair<K, V>());

    Arrays.setAll(data, ix -> new FPair<K,V>());

第一个在每个位置填充相同的元素,当FPair未更改但可以共享时有用:当它是“不可变的”时。

第二种只是一种奇特的循环方式。