在相关接口上实施参数类型?

时间:2013-02-01 04:09:19

标签: java generics

这些界面非常简单:

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

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

这样有效,没问题。

但是现在,我如何要求F中的Thawed实施FrozenT Frozen来实施Thawed?< / p>

我能得到的最接近的是:

public interface Thawed<F extends Frozen<? extends Thawed<F>>>

public interface Frozen<T extends Thawed<? extends Frozen<T>>>

但这听起来非常递归......(也适用于Thawed<?>Frozen<?>

2 个答案:

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