質問

私は、抽象のgetType()メソッドを持つ基本クラスを有します。私は、サブクラスはこのメソッドを実装して使用するために実際のクラスを提供することができるようにしたいです。

のコードでは、次のような何かます:

public abstract class A {
    public static interface Tile;

    protected abstract Class<Tile> getTileClass();
}

public class B extends A {
    public static class MyTile implements A.Tile { }

    @Override
    protected abstract Class<A.Tile> getTileClass() {
        MyTile t = new MyTile();  // WORKS 
        return MyTile;            // ERROR HERE
    }
}

ここでの問題は、私はマークされた行に「MyTileは解決できない」してしまうことがあります。だから私が代わりにこれを返すようにしようとしています:

  

を返す新しいMyTile()。のgetClass()

が、今のEclipseは私に伝えます:

  

型の不一致:から変換できません   Class<capture#1-の? B.MyTile>は、拡張します   Class<A.Tile>

これは、私はバグがトップ(キャプチャ#1は?)ここではEclipseで多分あるかどうさえわからない。

次に、私はインターフェイスをあきらめると抽象ベースタイルのクラスを使用しようとしています。

:Eclipseのからいくつかの助けを借りて、私はコンパイルすると思われる次のコードで終わります
public abstract class A {
    public static abstract class Tile;

    protected abstract Class<? extends Tile> getTileClass();
}

public class B extends A {
    public static class MyTile exends A.Tile { }

    @Override
    protected abstract Class<? extends A.Tile> getTileClass() {
        return new MyTile().getClass();  // WORKS
        return MyTile;                   // "Cannot be resolved"
    }
}

だから私は基本的に3つの質問を持っているように見えます

1)これはA.Tileがインタフェースであることで動作するように取得することはできますか?

2)基本クラスを使用する場合は、Class<? extends X>は本当に行くための正しい方法は何ですか?

3)そして、どのように私は、メソッドの中から私の入れ子にB.MyTileクラスの参照を返すことができますか? 、右することはできませんnew MyTile().getClass()を行うには、それをすることができた?

役に立ちましたか?

解決

ジェネリック医薬品と共変タイプのオーバーライドは、一緒に非常にうまく機能しません。あなたは明示的にA.Tileののサブクラスのことができるクラスを返すようgetTileClass()を宣言する必要があります。

またMyTile.classと、それをinstanciatingずにMyTileのクラスオブジェクトにアクセスすることができます。

の代わりにこれを試してください:

public abstract class A {
    public static interface Tile;

    protected abstract Class<? extends Tile> getTileClass();
}

public class B extends A {
    public static class MyTile implements A.Tile { }

    @Override
    protected Class<MyTile> getTileClass() {
        return MyTile.class;
    }
}

さらに良いことには、ジェネリックを作ることであろう。あなたはまだクラスの型定義で使用するの拡張のを持っていますが、もう少し具体的にすることができます:

public abstract class A<T extends A.Tile> {
    public static interface Tile;

    protected abstract Class<? extends T> getTileClass();
}

public class B extends A {
    public static class MyTile implements A.Tile { }

    @Override
    protected Class<MyTile> getTileClass() {
        return MyTile.class;
    }
}

他のヒント

public abstract class A {
    public static interface Tile {};

    // I return something that is-a Tile
    protected abstract Tile getTileClass();
}

public class B extends A {
    public static class MyTile implements A.Tile { }

    @Override
    protected abstract Tile getTileClass() {
        return new MyTile();
    }
}

ジェネリック医薬品のための必要はありませんが、あなたはちょうどあなたがタイルやタイルサブクラスを返すことを言いたいです。

なお、クラスのパブリック静的インタフェースは、「コードのにおい」です。どちらかそれはそうAの唯一のサブクラスは、タイルを実装するか、独自のトップレベルインターフェースにそれを置くことができ、保護されたことを確認してください。誰もがそれが混在メッセージを送信し実装することが可能にすぎないに入れてます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top