Javaジェネリックの難問

generics java
Javaジェネリックの難問

関連するコードは次のとおりです。

public interface Artifact {}
public interface Bundle implements Artifact {}
public interface Component implements Artifact {}

public interface State {
    void transition(T artifact, State nextState);
}

これにより、この列挙型を定義できます。

enum BundleState implements State {

    A, B, C;

    public void transition(Bundle bundle, State nextState) {}
    }
}

しかし、私が欲しいメソッドのシグネチャは次のとおりです。

    public void transition(Bundle bundle, BundleState nextState) {}
    }

しかし、これはコンパイルされません。 明らかに問題は、「State」インターフェースで「T」を定義した方法にありますが、それを修正する方法がわかりません。

ありがとう、ドン

  4  0


ベストアンサー

物事が手に負えなくなるかもしれませんが、 `State`を次のように変更する必要があります:

public interface State> {
    void transition(T artifact, U nextState);
}

BundleStateを次のように変更します。

public enum BundleState implements State {
    A, B, C;

    public void transition(Bundle bundle, BundleState nextState) {}
}

10


メソッドはJavaでは反変ではありません。 両方をオーバーロードすることもできますが、あまり意味はありません。

おそらく、 `State`を次のように宣言できます。

public interface State, A extends Artifact> {
    void transition(A artifact, THIS nextState);
}

「THIS extends State」は間違っている可能性があります。 それはあなたがやりたいことによります。

(1文字の列挙型定数は、特にジェネリックパラメーターと混合する場合は特に悪い考えです。)

3


transition(Bundle、BundleState)は、他の人によって提案されているように変更しない限り、現在のStateインターフェイスと一致しません。 インターフェースを保存することもできます

enum BundleState implements Artifact, State {
    A, B, C;
    public void transition(BundleState bundle, State nextState)
    {
    }
}

1


enum BundleState implements State
{
    A, B, C;

    public void transition(Bundle bundle, BundleState nextState)
    {
        transition(bundel, (State)nextState);
    }

    public void transition(Bundle bundle, State nextState) {}
}

0


タイトルとURLをコピーしました