在超类中定义泛型类型,它指的是它所在的子类的类型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在超类中定义泛型类型,它指的是它所在的子类的类型相关的知识,希望对你有一定的参考价值。
题 有没有办法在超类中实现泛型类型或类似的东西,它总是引用它所在的子类?
解释我需要什么
我有超类
public abstract class MySuperclass{
public abstract *magicalTypeReference* getInstance();
}
当我创建它的子类时,我希望* magicalTypeReference *成为它所在的子类的类型。
public class FirstSubclass extends MySuperclass{
@Override
public FirstSubclass getInstance(){return this;}
}
public class SecondSubclass extends MySuperclass{
@Override
public SecondSubclass getInstance(){return this;}
}
为什么普通的通用类型不能完成这项工作
从技术上讲,通用类型可以做类似的事情。
public abstract class MySuperclass<E extends MySuperclass>{
public abstract E getInstance();
}
public class FirstSubclass extends MySuperclass<FirstSubclass>{
@Override
public FirstSubclass getInstance(){return this;}
}
public class SecondSubclass extends MySuperclass<SecondSubclass>{
@Override
public SecondSubclass getInstance(){return this;}
}
但泛型类型不保证以后的类型被强制为子类。从技术上讲,您可以使用另一个子类作为泛型类型来创建子类。像这样
public class SecondSubclass extends MySuperclass<FirstSubclass>{
@Override
public FirstSubclass getInstance(){return this;}
}
java中是否有一些构造可以提供“类型安全”的实现方式?
答案
这在Java中是不可能的。
考虑假设你想要什么是可能的,你可以像这样实现FirstSubclass
:
public class FirstSubclass extends MySuperclass {
@Override
public FirstSubclass getInstance() { return new FirstSubclass(); }
}
然后你可以有一个子类,它不会覆盖getInstance()
方法:
public class SubSubclass extends FirstSubclass { }
由于继承,SubSubclass
还实现了MySuperclass
接口。然而,SubSubclass
的getInstance()
方法继承自FirstSubclass
,它返回FirstSubclass
。因此,SubSubclass
不满足MySuperclass
接口的合同,因为它的getInstance()
方法不返回SubSubclass
。
另一答案
而不是宣布你的MySuperClass
喜欢
public abstract class MySuperClass<E extends MySuperClass>
如果你宣布像
public abstract class MySuperClass<E extends MySuperClass<E>>
您可以使子类避免在某种意义上相互引用。
这个解决方案肯定会避免这样的情况
public class SecondSubclass extends MySuperclass<FirstSubclass>{
@Override
public FirstSubclass getInstance(){return this;}
}
public class FirstSubclass extends MySuperclass<SecondSubclass>{
@Override
public SecondSubclass getInstance(){return this;}
}
其中一个类包含另一个类,反之亦然。
以上是关于在超类中定义泛型类型,它指的是它所在的子类的类型的主要内容,如果未能解决你的问题,请参考以下文章