jmgonet:
私は一般的な構文を持つすべてのコードを汚染しないようするように、パラメータ化インタフェースのための短い名前としてインターフェイスを使用したいと思います。例えば:
EggChicken egg = chicken.lay(); // Can't make it compile.
の代わりに:
Egg<AnimalChicken> egg = chicken.lay(); // Compiles happily.
私はパラメータ化クラスを使用した動物の再生モードを(モデル化したいと言うhttps://en.wikipedia.org/wiki/Modes_of_reproduction)。私は、次のインタフェースを持っています:
public interface Animal<T> {
T lay();
}
interface Viviparous<T extends Viviparous> extends Animal<T> {
}
interface Egg<T extends Oviparous> {
T hatch();
}
interface Oviparous<T extends Oviparous> extends Animal<Egg<T>> {
}
アイデアは胎生の動物がいることをされて横たわっていた卵生動物は一方で、同じ動物の新しいインスタンスを築くことの卵を孵化同じ動物の新しいインスタンス。
今、私は犬とチキンを記述するために、より正確なインタフェースを定義したいと思います:
interface AnimalDog extends Viviparous<AnimalDog> {
}
interface AnimalChicken extends Oviparous<AnimalChicken> {
}
interface EggChicken extends Egg<AnimalChicken> {
}
最後に、これらの実装は、次のとおりです。
public class AnimalDogImpl implements AnimalDog {
@Override
public AnimalDog lay() {
return new AnimalDogImpl();
}
}
class AnimalChickenImpl implements AnimalChicken {
@Override
public EggChickenImpl lay() {
return new EggChickenImpl();
}
}
public class EggChickenImpl implements EggChicken {
@Override
public AnimalChicken hatch() {
return new AnimalChickenImpl();
}
}
私は、コード内のクラスを使用する場合私の問題が来ます:
public class AnimalTest {
@Test
public void can_do_something_nice() {
AnimalChicken chicken = new AnimalChickenImpl();
// Error here:
EggChicken egg = chicken.lay();
AnimalChicken chick = egg.hatch();
Assertions.assertThat(chick).isNotNull();
}
}
:私はエラーが出る必要EggChickenは、卵<AnimalChicken>を見つけ、これは私が定義されてどのように正確ですEggChicken
。それは間接のこの種を解決することは可能ですか?
ティロ:
あなたは何と呼ばれて探しているタイプの別名。
Javaは、残念ながらそれらを持っていません。
あなたは新しいインターフェイスを作成すると、それは新しい型を定義します。インスタンスは、EggChicken
ものインスタンスでEgg<Chicken>
はなく、他の方法で回避。あなたは確認する必要がありますAnimalChicken
(インターフェイス!)を返すEggChicken
明示。