像以下一系列用法: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的对象吗?这种用法只能用在接口的声明上吗?
} 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的对象吗?这种用法只能用在接口的声明上吗?
jdk在1.4版后引入了泛型就解决了这个问题
如 :
List<String> list = new ArrayList<String>()
这样就保证装入list中的数据全部是String类型,等需要取出来的时候直接拿出来list.get(int),返回值类型就一定是String类型,就不需要再从Objecti类型强制转换成String类型了,说白了,泛型就是提供类型安全,帮程序员省去强制转换了
说了这么多,不知兄台明白了没,如果没有,自己写几个测试下先用着,慢慢体会,希望对你有帮助!
没有一定要像JAVA中的T,K,V,E一样,类型你可以自己随便定啊,也并不是只运用在接口上,你想的话可以随便指定,前提是API中提供了这个接口.使用G、A、R三个字母分别代表GameObject、MapArchObject和Archetype的对象吗?
这个也是自己指定的,没有说一定,你上面写的是G extends GameObject,所以G类型是GameObject的扩展类,A,R同理
}
这种声明方法,还需要对T进行instanceof比较才能确定究竟是哪个继承了MapArchObject的子类?
你说的是常见的用法,这个基本上学过java的都知道,我说的这种写法不太多见,你刚才并没有说明这样做的意义何在啊