`
韩悠悠
  • 浏览: 841914 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

泛型讨论------危害的解决2

阅读更多

擦除失去了在泛型代码中执行某些操作的能力,任何在运行时需要知道确切类型信息的操作都将无法工作,看下面的例子:

 

public class Eras<T>{

	public static void main(String[] args){
		
		if(ages instanceof T){}//出错
		T var = new T();       //出错
		T[] array  =new T[100];//出错
		
	}
}

 

在例子中使用instanceof失败,因为它的类型已经被擦除了。

 

 

不能创建泛型数组,

如果想创建泛型数组,使用ArrayList,

 

public class ListOfGenerics<T>{

	private List<T> array = new ArrayList<T>();
	public void add(T item){
		array.add(item);
	}

	public T get(int idnex){
		retrun array.get(index);
	}
}

 

 

即使创建了数组

Dog<Integer>[] dog;

在编译器是没有问题的,但是在运行期仍然是个Object类型。

 

解决办法:

 

不能创建T[] array  = new T[sz];,可创建一个对象数组,将其转型

public class A{
	
	private T[] array;
	public A(int size){
		array = (T[])new Object[size];
	}
}

 

class Fruit {}
class Apple extends Fruit {}
class Jonathan extends Apple {}
class Orange extends Fruit {}

public class CovariantArrays {
  public static void main(String[] args) {
    Fruit[] fruit = new Apple[10];
    fruit[0] = new Apple(); // OK
    fruit[1] = new Jonathan(); // OK
    // Runtime type is Apple[], not Fruit[] or Orange[]:
    try {
      // Compiler allows you to add Fruit:
      fruit[0] = new Fruit(); // ArrayStoreException
    } catch(Exception e) { System.out.println(e); }
    try {
      // Compiler allows you to add Oranges:
      fruit[0] = new Orange(); // ArrayStoreException
    } catch(Exception e) { System.out.println(e); }
  }
} /* Output:
java.lang.ArrayStoreException: Fruit
java.lang.ArrayStoreException: Orange

 编译器允许放入Fruit对象,但这在运行时处理的却是Apple[]类型,错误就发生了,ArrayStoreException

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics