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