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<?>ます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> { }

これを防ぐには、次の2つの汎用パラメーターを使用します。

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 に答える