当我有一个界面时
public interface Foo<T> {
T someMethod();
}
有什么方法可以确保当某个类实现此接口时,泛型类型是相同的实现类。
例如:
public class Bar implements Foo<Bar> {
Bar someMethod() {
return new Bar();
}
}
是的,这是可以做到的(有点;见下文)。(在 C++ 世界中,这称为“奇怪的重复模板模式 http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern”,但它也适用于 Java):
public interface Recur<T extends Recur<T>> {
// ...
}
(注意第二次提到T
。这是 CRTP 的重要组成部分。)
还有,就是这样java.util.Enum
被定义,这样一个枚举类型称为Foo
必须源自Enum<Foo>
,所以这在 Java 中也不是一个不常见的模式。
我想说的是,以上是故事的结尾,但 tangens 在他们的修订中正确地指出,它并不完全可靠,并且实际上与他们的答案没有什么不同。
两者之间有一个区别(我能想到)Recur<T>
我有的解决方案,以及Recur<?>
tangens 的解有:
public interface Recur<T extends Recur<T>> {
T foo();
}
class A implements Recur<B> {
@Override
public B foo() {
return new B();
}
}
class B implements Recur<A> {
@Override
public A foo() {
return new A();
}
}
With <T>
,以上内容无法编译;和<?>
, 它会。但这只是吹毛求疵而已。它不会改变 tangens 的中心点,即给定一个已经有效的Recur
实现,您可以使后续实现使用已经有效的类型,而不是其本身。我仍然说这是有价值的,但这并不比 tangens 的答案更有价值。
最后,如果可以的话,也请对 tangens 的答案投赞成票。 (tangens,你应该触摸你的帖子,这样我也可以给你投票。)他们有一个非常好的观点,很抱歉我第一次错过了它。谢谢,唐根斯!
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)