内部クラスを参照する方法はありますか?
内部クラスと互換性のある戻り値の型を指定したい
Class<OuterClass.*> some_method();
この構文が無効であることは理解しています。これを表現する方法はありますか?
Class<? extends OuterClass>
内部クラスは外部クラスを拡張しないため、次のようなものを使用できないことはわかっています。
内部クラスを参照する方法はありますか?
内部クラスと互換性のある戻り値の型を指定したい
Class<OuterClass.*> some_method();
この構文が無効であることは理解しています。これを表現する方法はありますか?
Class<? extends OuterClass>
内部クラスは外部クラスを拡張しないため、次のようなものを使用できないことはわかっています。
少なくとも、特定の内部クラスを参照できます。
<T extends OuterClass.InnerClass> Class<T> some_method()
それ以外に、内部クラスのオブジェクトを返すことで何が得られるでしょうか? これは、任意のオブジェクトを返すことに加えて、内側のインスタンスが外側のインスタンスと特別な関係にあるという事実に匹敵します。ただし、とにかくその特別な関係を直接使用することはおそらくできないでしょう。
編集:
他の人がすでに指摘しているInnerClass
ように、他の内部クラスによって拡張されたスーパークラスである可能性があります。これにより、そのクラスを拡張する任意のクラスを返すことができます。
インターフェイスを使用する場合、内部クラスのみに制限されません。この制限のために非静的内部インターフェイスが必要になるためです。ただし、内部インターフェイスはデフォルトで静的です。
(内部) インターフェースを定義し、すべての内部クラスにそれを実装させてから、次のようにします。
Class<OuterClass.MyInterface> someMethod();
これは、内部クラスを参照しようとするよりも型の安全性が高くなります。また、別の用途で別の内部クラスが必要になった日や、クラスを抽出することにした日も問題ありません。
マーカーインターフェイスを定義し、Innerクラスで実装できます。
<T implements CustomMarkerInterface> Class<T> some_method()
したがって、これはのすべての内部クラスに適用できますOuterClass
public class Outer {
public class Inner implements CustomMarkerInterface{
}
public class Inner1 implements CustomMarkerInterface{
}
public class Inner2 implements CustomMarkerInterface{
}
}
Class<InnerClass>
Javaで許可されています。あなたは何か特定のものを探していますか?
public class Client
{
interface InnerType
{
}
public class InnerClass implements InnerType
{
}
public Class<? extends Client.InnerType> test()
{
return InnerClass.class;
}
}
いいえ、ありません。ワイルドカードを使用してパッケージを参照できないのと同じように:
Class<com.example.*> some_method();
Class<com.example.?> some_method();
このような宣言の使用例は非常に限られているため、JLS には含まれません。ジェネリックの範囲外でも、このような「場所の一致タイプ」を使用できないことに注意してください。たとえば、次のように宣言することはできません。
void some_method(OuterClass.* argument);
void some_method(com.example.* argument);