泛型
泛型之间的继承关系
一、接口继承
/** *正确的继承
*继承类包括被继承中所有的类型 */ public interface IStubConsumer<StubType> { Class<StubType> getStubType(); } public interface InvokeAction<Stub,Rsp> { Rsp doInvoke(Stub stub); } public interface IRemoteInvocation<Stub,Rsp> extends InvokeAction<Stub,Rsp>,IStubConsumer<Stub> { Rsp decode(Object rawResponse); }
/** *正确的继承 *继承类中的泛型比被继承勒种的泛型多,此例子是多个泛型M * */ public interface IStubConsumer<StubType> { Class<StubType> getStubType(); } public interface InvokeAction<Stub,Rsp> { Rsp doInvoke(Stub stub); } public interface IRemoteInvocation<Stub,Rsp,M> extends InvokeAction<Stub,Rsp>,IStubConsumer<Stub> { Rsp decode(Object rawResponse); }
/** *错误的继承 * *继承中的泛型比被继承中的泛型少,此例子是少个泛型Rsp * */ public interface IStubConsumer<StubType> { Class<StubType> getStubType(); } public interface InvokeAction<Stub,Rsp> { Rsp doInvoke(Stub stub); } public interface IRemoteInvocation<Stub> extends InvokeAction<Stub,Rsp>,IStubConsumer<Stub> { Rsp decode(Object rawResponse); }
/** *错误的继承 *被继承中泛型类型个数,要和本身的泛型数量相同, *此例子被继承的接口比InvokeAction比原有的泛型少了一个 *泛型Rsp */ public interface IStubConsumer<StubType> { Class<StubType> getStubType(); } public interface InvokeAction<Stub,Rsp> { Rsp doInvoke(Stub stub); } /* *错误 *被继承的接口InvokeAction比原有的接口少了一个泛型 *Rsp */ public interface IRemoteInvocation<Stub,Rsp> extends InvokeAction<Stub>,IStubConsumer<Stub> { Rsp decode(Object rawResponse); }
/** *正确 *被继承中的泛型,泛型类型可以一个都不用,表示具体的队形 *Object * */ public interface IStubConsumer<StubType> { Class<StubType> getStubType(); } public interface InvokeAction<Stub,Rsp> { Rsp doInvoke(Stub stub); } /** *正确 *被继承的接口InvokeAction一个泛型都没有添加,表示被继承的 *接口的泛型被具体的对象所代替 * */ public interface IRemoteInvocation<Stub,Rsp> extends InvokeAction,IStubConsumer<Stub> { Rsp decode(Object rawResponse); }
/** *错误 * *被继承的接口中的泛型不能被缩小 */ public interface InvokeAction<Stub,Rsp> { Rsp doInvoke(Stub stub); } /** *被继承的接口InvokeAction中的泛型Rsp 被缩小成了User的子类 * */ public interface IRemoteInvocation<Stub,Rsp> extends InvokeAction<Stub ,Rsp extends User>{ }
/** *正确 * *继承类中的泛型被缩小 */ public interface InvokeAction<Stub,Rsp> { Rsp doInvoke(Stub stub); } /** *继承接口IRemoteInvocation中的泛型范围被缩小,Rsp被缩小成了Usr的*子类 */ public interface IRemoteInvocation<Stub,Rsp extends User> extends InvokeAction<Stub ,Rsp >{ }
/** *正确 *被继承几口中的泛型被具体的对象代替 */ public interface InvokeAction<Stub,Rsp> { Rsp doInvoke(Stub stub); } /** *被继承接口中的泛型Rsp被具体的对象User 代替 */ public interface IRemoteInvocation<Stub> extends InvokeAction<Stub ,User >{ }
/** *错误 * *继承接口中的类不能被具体的对象代替 */ public interface InvokeAction<Stub,Rsp> { Rsp doInvoke(Stub stub); } /** *错误 * *继承接口IRemoteInvocation中的泛型Rsp被具体的对象User替代 */ public interface IRemoteInvocation<Stub,User> extends InvokeAction<Stub ,Rsp >{ }
总结:接口继承的时候,继承类中泛型不能少于被继承中的泛型,被继承的泛型要么和本身的泛型一样,要么一个泛型都不用,没有一个泛型表示是被具体的对象Object
所代替,类的泛型继承是和接口是相同的,即
1)继承的类的泛型要包含被继承类的所有泛型,即继承类的泛型数量大于等于被继承类的泛型
2)被继承类的泛型要和本身的泛型保持一致
3)被继承类可以不用写任何泛型,表示泛型被具体的对象类型Object所替代
4)被继承的类中的泛型范围不能通过继承关系被缩小,但是继承类中的泛型范围可以通过继承关系被缩小
5)被继承的类中的泛型可以被具体的对象所替代,但是继承类中的泛型不能被具体的对象所代替
二、类继承
/** *正确的继承 * *继承类中的泛型和被继承类中的泛型相同 */ public interface InvokeAction<Stub,Rsp> { Rsp doInvoke(Stub stub); } public abstract class AbstractInvocation<Stub,Rsp> implements InvokeAction<Stub,Rsp> { public String getName(){ return "zs"; } }
/** *正确的继承 * *继承中的泛型比被继承中的泛型多了一个类型M */ public interface InvokeAction<Stub,Rsp> { Rsp doInvoke(Stub stub); } public abstract class AbstractInvocation<Stub,Rsp,M> implements InvokeAction<Stub,Rsp> { public String getName(){ return "zs"; } }
/** *错误的继承 * *继承中的泛型比被继承中的泛型少,此例少了一个泛型Rsp */ public interface InvokeAction<Stub,Rsp> { Rsp doInvoke(Stub stub); } public abstract class AbstractInvocation<Stub> implements InvokeAction<Stub,Rsp> { public String getName(){ return "zs"; } }
/* *正确 *被继承的接口InvokeAction没有一个泛型,表是泛型是具体的对象Object */ public interface InvokeAction<Stub,Rsp> { Rsp doInvoke(Stub stub); } /** *InvokeAction没有泛型,表示此接口中的泛型被是具体的对象Object */ public interface IRemoteInvocation<Stub,Rsp> extends InvokeAction,IStubConsumer<Stub> { Rsp decode(Object rawResponse); }
总结:以上类的继承是和接口的继承是相同的,关于泛型类和类的继承,也是具有和接口之间泛型的继承关系是相同的,即
1)继承的类的泛型要包含被继承类的所有泛型,即继承类的泛型数量大于等于被继承类的泛型
2)被继承类的泛型要和本身的泛型保持一致
3)被继承类可以不用写任何泛型,表示泛型被具体的对象类型Object所替代
/** *正确 * *被继承类中的泛型被具体的对象所代替 */ public class User { private String id; private String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } public interface InvokeAction<Stub,Rsp> { Rsp doInvoke(Stub stub); } /** *此处的泛型被具体的对象User所代替 */ public class Invocation<Stub> implements InvokeAction<Stub,User> { @Override public User doInvoke(Stub stub) { return null; } }
/** *错误 * *被继承类中的泛型范围不能被缩小 */ public class User { private String id; private String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } public interface InvokeAction<Stub,Rsp> { Rsp doInvoke(Stub stub); } /** *InvokeAction中的泛型Rsp范围被缩小成了User的子类 */ public class Invocation<Stub> implements InvokeAction<Stub,Rsp extends User> { @Override public Rsp doInvoke(Stub stub) { return null; } }
/** *正确 * *继承类中的泛型被缩小 */ public class User { private String id; private String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } public interface InvokeAction<Stub,Rsp> { Rsp doInvoke(Stub stub); } /* *正确 * *Invocation中的泛型Rsp被缩小成User的子类 */ public class Invocation<Stub,Rsp extends User> implements InvokeAction<Stub,Rsp> { @Override public Rsp doInvoke(Stub stub) { return null; } }
/** *错误 * *继承类中的泛型不能被具体的对象代替,原因:因为被具体的对象替代了后 *继承中的泛型会比被继承的中的泛型少了一个被替代的泛型 */ public class User { private String id; private String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } public interface InvokeAction<Stub,Rsp> { Rsp doInvoke(Stub stub); } /** *错误 * *Invocation中的泛型Stub被具体的对象User替代,次数少了一个 *泛型Stub */ public class Invocation<User,Rsp> implements InvokeAction<Stub,Rsp> { }
总结:
1)被继承的类中的泛型范围不能通过继承关系被缩小,但是继承类中的泛型范围可以通过继承关系被缩小
2)被继承的类中的泛型可以被具体的对象所替代,但是继承类中的泛型不能被具体的对象所代替
总之:无论是接口中泛型继承还是类中的泛型继承都具有一下特点
1)继承的类的泛型要包含被继承类的所有泛型,即继承类的泛型数量大于等于被继承类的泛型
2)被继承类的泛型要和本身的泛型保持一致
3)被继承类可以不用写任何泛型,表示泛型被具体的对象类型Object所替代
4)被继承的类中的泛型范围不能通过继承关系被缩小,但是继承类中的泛型范围可以通过继承关系被缩小
5)被继承的类中的泛型可以被具体的对象所替代,但是继承类中的泛型不能被具体的对象所代替
posted on 2020-04-17 09:23 huangyh3675 阅读(118) 评论(0) 收藏 举报
浙公网安备 33010602011771号