昨天写了一些东西,可是一发布就没有了!!!
今天不决定重新写了,从最关键的地方入手!!
/**
* @(#)Generics.java
*
*
* @author
* @version 1.00 2008/9/27
*/
class Book{
static int id;
Book(){System.out.println("Book "+id++);}
}
class EnglishBook extends Book{}
class ChineseBook extends Book{}
class ChineseHistory extends ChineseBook{}
class Generics2<T>{
private T a;
public Generics2(T a) {
this.a=a;
}
public void set(T a){this.a=a;}
public T get(){return a;}
}
public class Generics<T> {
private T a;
public Generics(T a) {
this.a=a;
}
public void set(T a){this.a=a;}
public T get(){return a;}
public static void main (String[] args) {
Generics<EnglishBook> b=new Generics<EnglishBook>(new EnglishBook());
Generics<Integer> b2=new Generics<Integer>(new Integer(47));
Class c=b.getClass();
Class c2=b2.getClass();
System.out.println(c==c2);
System.out.println(c);
System.out.println(c2);
}
}
--------------------Configuration: <Default>--------------------
Book 0
true
class Generics
class Generics
Process completed.
可以看到无论是Generics<EnglishBook>还是Generics<Integer>的Class都被输出为他们的原生类型Generics,也就是说编译器并不区分Generics<EnglishBook>和Generics<Integer>!!!那么EnglishBook 和Integer的信息到底到哪里去了呢??
这主要的原因是java的泛型使用了擦除机制!!
可是他们被擦除到什么程度呢??很显然,只能是Object,否则他们怎么能够说他们是相同的呢??正如EnglishBook和Integer一样,他们唯一的共同点就是他们都是Object!!这是唯一可以的假设,也是正确的结论!!!