0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 Varargs 警告+不能实例化类型变量 的知识;
1.1)一个相关问题: 向参数个数可变的方法传递一个泛型类型的实例;
public static void addAll(Collection
Collection> table = ......;
Pair pair1 = ....;
Pair pair2 = ....;
addAll(table, pair1, pair2);
1.4)可以采用以下两种方法来抑制这种警告(Methods):(解决方法)
@SuppressWarnings("unchecked");
@SafeVarargs
public static void addAll(Collection coll, T...ts);
Annotation)
@SafeVarargs
static E[] array(E... array)
{
return array;
}
Pair[] table = array(pair1, pair2);
Object[] objarray = table;
objarray[0] = new Pair();
2.1)不能使用像 new T(…), new T[…] 或 T.class 这样的表达式中的类型变量。
public Pair()
{
first = new T();
second = new T(); // ERROR
}
然而,我们却不能调用: first = T.class.newInstance();//ERROR
public static Pair makePair(Class cl)
{
try{ return new Pair<>(c1.newInstance(), c1.newInstance()) }
catch(Exception ex) {return null;}
}
Pairp = Pair.makePair(String.class);
public static T[] minmax(T[] a) { T[] mm = new T[2]; ...} //ERROR
2.2)如果数组仅仅是作为一个类的私有实例域, 就可以将这个数组声明为 Object[], 并且在获取元素时进行类型转换。
public class ArrayList<E>
{
private Object[] elements;
...
@SuppressWarnings("unchecked")
public E get(int n)
{
return (E) elements[n]; //获取元素时进行类型转换
}
pubic void set(int n, E e)
{
elements[n] =e;
}
}
public class ArrayList<E>
{
paivate E[] elements;
...
public ArrayList(){ elements = (E[])new Object[0]; }
}
2.3)由于 minmax方法 返回 T[] 数组, 使得这一技术无法施展, 如果掩盖这个类型会有运行时错误。假设实现代码:
public static T[] minmax(T...a)
{
Object[] mm = new Object[2];
...
reutrn (T[]) mm;
}
2.4)调用String[] ss = minmax(“tom”, “dick”, “Harry”);
对上述代码的分析(Analysis):
public static T[] minmax(T... a)
{
T[] mm = (T[])mm.newInstance(a.getClass().getComponentType(), 2);
}
Object[] toArray();
T[] toArray(T[] result);