Java泛型接口使用问题:子类实例无法赋值父泛型类型如何解决
泛型类型不兼容问题的解决方案
问题根源在于Java泛型的不变性:尽管FooAInfo是FooInfo的子类,但IFoo<FooAInfo>与IFoo<FooInfo>之间不存在继承关系,因此无法直接赋值。下面提供两种可行的解决方式:
方式一:使用通配符放宽类型限制
将父类FooUser中的foo字段类型改为IFoo<? extends FooInfo>,这样就能接受所有泛型参数为FooInfo子类的IFoo实现:
public abstract class FooUser { protected IFoo<? extends FooInfo> foo; } public class FooAUser extends FooUser { public FooAUser() { super.foo = new FooA(); } } public class FooBUser extends FooUser { public FooBUser() { super.foo = new FooB(); } }
注意:使用? extends FooInfo后,无法在FooUser中直接调用foo.proc()方法(除非传入null),因为编译器无法确定具体的泛型参数类型,这是为了保证类型安全。
方式二:将FooUser改为泛型类
让父类FooUser携带泛型参数,并指定上限为FooInfo,子类则绑定具体的泛型类型,这种方式能保留完整的类型安全性,适合需要在父类中操作foo方法的场景:
public abstract class FooUser<T extends FooInfo> { protected IFoo<T> foo; } public class FooAUser extends FooUser<FooAInfo> { public FooAUser() { super.foo = new FooA(); } } public class FooBUser extends FooUser<FooBInfo> { public FooBUser() { super.foo = new FooB(); } }
这种方案下,你可以在FooUser中安全调用foo.proc()方法,传入符合T类型的参数即可。
内容的提问来源于stack exchange,提问作者Rurien
相关产品推荐
相关产品推荐

