Javaで入れ子になったクラス型を返します。
-
06-09-2019 - |
質問
私は、抽象の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の唯一のサブクラスは、タイルを実装するか、独自のトップレベルインターフェースにそれを置くことができ、保護されたことを確認してください。誰もがそれが混在メッセージを送信し実装することが可能にすぎないに入れてます。