ここthis質問(初期コードは、問題を強調するのに十分ではなかった)周期的なジェネリック医薬品(2を試してみてください)
の第二試みがコンパイルできないコードは次のとおりです。
interface Player<R, G extends Game>
{
R takeTurn(G game);
}
interface Game<P extends Player>
{
void play(P player);
}
abstract class AbstractGame<R, P extends Player>
implements Game<P>
{
public final void play(final P player)
{
final R value;
value = player.takeTurn(this);
turnTaken(value);
}
protected abstract void turnTaken(R value);
}
public class XPlayer
implements Player<Integer, XGame>
{
@Override
public Integer takeTurn(final XGame game)
{
return (42);
}
}
public class XGame<P extends Player<Integer, XGame>>
extends AbstractGame<Integer, XPlayer>
{
@Override
protected void turnTaken(final Integer value)
{
System.out.println("value = " + value);
}
}
public class Main
{
public static void main(final String[] argv)
{
final XPlayer player;
final XGame game;
player = new XPlayer();
game = new XGame();
game.play(player);
}
}
私は何逆に実行すると、AbstractGameでplayメソッドをコンパイルするようにしようとしています。私はGameとPlayerでジェネリックスを追加してサークルで走らなければならないようですが、私の人生ではそれをまっすぐにすることはできません。
playメソッドはAbstractGameクラスでfinalでなければならず、キャストを行う方法がないため、turnTakenのような別のメソッドを記述したくない場合は、に。
編集:ここで要求されるようにコンパイルするコードがあるが、キャストを必要とする:
interface Player<R, P extends Player<R, P, G>, G extends Game<R, G, P>>
{
R takeTurn(G game);
}
interface Game<R, G extends Game<R, G, P>, P extends Player<R, P, G>>
{
void play(P player);
}
abstract class AbstractGame<R, G extends Game<R, G, P>, P extends Player<R, P, G>>
implements Game<R, G, P>
{
public final void play(final P player)
{
final R value;
value = player.takeTurn((G)this);
turnTaken(value);
}
protected abstract void turnTaken(R value);
}
class XPlayer
implements Player<Integer, XPlayer, XGame>
{
@Override
public Integer takeTurn(final XGame game)
{
return (42);
}
}
class XGame
extends AbstractGame<Integer, XGame, XPlayer>
{
@Override
protected void turnTaken(final Integer value)
{
System.out.println("value = " + value);
}
}
class Main
{
public static void main(final String[] argv)
{
final XPlayer player;
final XGame game;
player = new XPlayer();
game = new XGame();
game.play(player);
}
}
私は一度のように、あなたはJavaの一般的な地獄に遭遇したようです。私はその後、インターフェイスのためにジェネリック医薬品を放棄しました。 –
どうやってインターフェイスでやりますか? – TofuBeer
ジェネリックではなく、適切なオブジェクトを実装する必要があるインターフェイスを作ったのですが、私のメソッドはこのインターフェイスを引き出しました... –