像以下一系列用法:public interface MapArchObject<A extends MapArchObject<A>> extends Serializable {
} public interface Archetype<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> extends Cloneable, Iterable<GameObject<G, A, R>>, Serializable {    String TYPE = "type";    String NAME = "name";    GameObject<G, A, R> getMultiNext();    Iterator<GameObject<G, A, R>> iterator();//XXX:    Archetype<G, A, R> clone();}
public interface GameObject<G extends GameObject<G, A, R>, A extends MapArchObject<A>, R extends Archetype<G, A, R>> extends Cloneable, Iterable<GameObject<G, A, R>>, Serializable {    GameObject<G, A, R> getTopContainer();    GameObject<G, A, R> getContainerGameObject();    GameObject<G, A, R> getHead();    Iterator<GameObject<G, A, R>> iterator();    GameObject<G, A, R> getFirst();//XXX:    GameObject<G, A, R> clone();}
这么做的目的是什么?是为了像java中的T、K、V、E一样,使用G、A、R三个字母分别代表GameObject、MapArchObject和Archetype的对象吗?这种用法只能用在接口的声明上吗?

解决方案 »

  1.   

    泛型就是类型安全,装入容器再取出来会失去对象原来的类型
    jdk在1.4版后引入了泛型就解决了这个问题
    如 :
    List<String> list = new ArrayList<String>()
    这样就保证装入list中的数据全部是String类型,等需要取出来的时候直接拿出来list.get(int),返回值类型就一定是String类型,就不需要再从Objecti类型强制转换成String类型了,说白了,泛型就是提供类型安全,帮程序员省去强制转换了
    说了这么多,不知兄台明白了没,如果没有,自己写几个测试下先用着,慢慢体会,希望对你有帮助!
      

  2.   

    这样做的目的还是为了存取安全(不需再转换类型)和方便(取出就可以直接用),这么做的目的就是这个。至于是为了像java中的T、K、V、E一样,使用G、A、R三个字母分别代表GameObject、MapArchObject和Archetype的对象吗?
    没有一定要像JAVA中的T,K,V,E一样,类型你可以自己随便定啊,也并不是只运用在接口上,你想的话可以随便指定,前提是API中提供了这个接口.使用G、A、R三个字母分别代表GameObject、MapArchObject和Archetype的对象吗?
    这个也是自己指定的,没有说一定,你上面写的是G extends GameObject,所以G类型是GameObject的扩展类,A,R同理
      

  3.   

    java中的泛型是假泛型,在书中开头就说了的,最总编译器还是编译成普通代码来执行的。
      

  4.   

    明白一些了,是不是就是不用超类,直接根据子类的名字来使用,不像public interface MapArchObject<T extends MapArchObject> extends Serializable {

    这种声明方法,还需要对T进行instanceof比较才能确定究竟是哪个继承了MapArchObject的子类?
      

  5.   


    你说的是常见的用法,这个基本上学过java的都知道,我说的这种写法不太多见,你刚才并没有说明这样做的意义何在啊