3

这些接口非常简单:

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

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

这行得通,没问题。

但是现在,我将如何要求F实施和实施?ThawedFrozenTFrozenThawed

我能得到的最接近的是:

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

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

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

4

2 回答 2

3

我认为这应该有效:

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

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

我认为您不需要比这更深的东西,因为您需要做的就是指定它F是某种Frozen(并且类似地T)。

于 2013-02-01T04:14:37.040 回答
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> { }
于 2013-02-01T04:17:07.543 回答