这些界面非常简单:
public interface Thawed<F>
{
F freeze();
}
public interface Frozen<T>
{
T thaw();
}
这样有效,没问题。
但是现在,我如何要求F
中的Thawed
实施Frozen
,T
Frozen
来实施Thawed
?< / p>
我能得到的最接近的是:
public interface Thawed<F extends Frozen<? extends Thawed<F>>>
public interface Frozen<T extends Thawed<? extends Frozen<T>>>
但这听起来非常递归......(也适用于Thawed<?>
和Frozen<?>
)
答案 0 :(得分:3)
我认为这应该有效:
public interface Thawed<F extends Frozen<?>> { ... }
public interface Frozen<T extends Thawed<?>> { ... }
我认为你不需要更深层次的东西,因为你需要做的只是指明F
是某种Frozen
(同样适用于T
)。< / p>
答案 1 :(得分:1)
我能得到的最接近的是
这是正确的答案;你不可能比Java类型系统更好。
请注意,这确实允许
class Cat implements Thawed<Dog> { }
class HouseCat extends Cat { }
class Dog implements Frozen<HouseCat> { }
您可以通过使用两个通用参数来阻止这种情况:
public interface Thawed<F extends Frozen<T, F>, T extends Thawed<F, T>> { }
public interface Frozen<T extends Thawed<F, T>, F extends Frozen<T, F>> { }
但是,我觉得这太麻烦了,无法发挥作用。
它仍然允许
class Cat implements Thawed<Dog, HouseCat> { }
class HouseCat extends Cat { }
class Dog implements Frozen<HouseCat, Dog> { }