Java 在依赖接口上强制参数类型?

Java 在依赖接口上强制参数类型?,java,generics,Java,Generics,这些接口非常简单: public interface Thawed<F> { F freeze(); } public interface Frozen<T> { T thaw(); } 但这听起来很递归。。。(也适用于解冻的和冻结的)我认为这应该可以: public interface Thawed<F extends Frozen<?>> { ... } public interface Frozen<T exten

这些接口非常简单:

public interface Thawed<F>
{
    F freeze();
}

public interface Frozen<T>
{
    T thaw();
}

但这听起来很递归。。。(也适用于
解冻的
冻结的

我认为这应该可以:

public interface Thawed<F extends Frozen<?>> { ... }

public interface Frozen<T extends Thawed<?>> { ... }
公共接口解冻>{…}
我认为您不需要比这更深入的东西,因为您所需要做的就是指定
F
是某种
冻结的
(对于
t
,也同样如此)

我能得到的最接近的是

这是正确的答案;在Java类型系统中,您无法获得比这更好的结果


请注意,这确实允许

class Cat implements Thawed<Dog> { }
class HouseCat extends Cat { }
class Dog implements Frozen<HouseCat> { }

类Cat实现解冻{} 类HouseCat扩展了Cat{} 类Dog实现冻结{}
您可以通过使用两个常规参数来防止这种情况:

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> { }

类Cat实现解冻{} 类HouseCat扩展了Cat{} 类Dog实现冻结{}
class Cat机具解冻
class Dog机具冻结
@SLaks-但是
解冻
的定义要求
Dog
扩展
冻结
(等等),这正是OP想要的。OP没有说这两类动物需要彼此相反(例如,当你冷冻一只
时你得到的
冷冻猫
在解冻时会再次产生一只
。它可能会产生狗食。)我认为这是暗示。这确实是我在寻找的——这两类动物是“关联”的通过这种冻结/解冻关系。看来我不得不放弃一些。。。松弛(抱歉:p)并在任何情况下都使用“足够好”的解决方案……是的,好吧,使用这个的类都是
final
——至少在我的代码中是这样。当其他人使用它时,无法保证这一点;)谢谢你消除我的疑虑@fge:再想想,你可以做得更好。
class Cat implements Thawed<Dog, HouseCat> { }

class HouseCat extends Cat { }

class Dog implements Frozen<HouseCat, Dog> { }