泛型

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;
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值