8.6.6不能构造泛型数组
数组本身也有类型,用来监控存储在虚拟机中的数组。这个类型会被擦除
public static T[] minmax(T[] a){T[] mm=new T[2]; …}
类型擦除会让这个方法永远构造Comparable[2]数组
public class ArrayList
{
private Object[] elements;
…
@SupperWarning(“unchecked”)public E get(int n){return (E) elements[n];}
public void set(int n, E e){elements[n]=e;}//no cast needed
}
实际的实现没有这么清晰
public class ArrayList
{
private E[] elements;
public ArrayList(){elements =(E[]) new Object[10];}
}
这里,强制类型转换E[] 是一个假象,而类型查出使其无法察觉。由于民max方法
public static T[] minmax(T…a)
{
Object[] mm = new Object[2]
…
return (T[]) mm;
}
String[] ss = ArrayAlg.minmax(“Tom”,“Dick”,“Harry”)
编译时不会有任何警告,当Object[]引用付给Comparable[]变量时,将会发生ClassCastException异常
在这种情况下,最好提供一个数组构造器表达式:
String[] ss = ArrayAlg.minmax(String[]::new,“Tom”,“Dick”,“Harry”)
public static T[] minmax(IntFunction<T[]> constr,T…a)
{
T[] mm=constr.apply(2);
…
}
比较老式的方法时利用反射,调用Array.newInstance:
public static T[] minmax(T … a)
{
T[] mm = (T[]) Array.newInstance(a.getClass().getCompnetType(),2);
…
}
ArrayList类的toArray 方法就没有那么幸运。它需要生成一个t[]数组,没有成分类型。因此有下面给两种不同的形式
Object[] toArray()
T[] toArray(T[] result)
8.6.7 泛型类的静态上下文中类型变量无效
不能在静态域中引用类型变量
public class Singleton<T>
{
private static T singleInstance;
public static T singleInstance()
{
if (singleInStance == null)
return singleInstance;
}
}
8.6.8 不能抛出或捕获泛型类的实例
public class Problem<T> extends Exception{/* ..*/}
catch 子句中不能使用类型变量
public static <T extends Throwable> void doWork(Class <T>t)
{
try
{
do work
}
catch (T e)
{
Logger.global.info(...)
}
}
public static void doWork(T t) throws T
{
try
{
do work
}
catch (Throwable realCause)
{
t.initCause(realCause);
throw t;
}
}