16

これらの 2 つの (有効な) 一般的な境界は次のとおりです。

<T extends Enum<T> & MyInterface>
<T extends Enum<? extends MyInterface>>

同じ?


インターフェイスがあるとします

interface MyInterface {
    void someMethod();
}

そして、それを実装するいくつかの列挙型:

enum MyEnumA implements MyInterface {
    A, B, C;
    public void someMethod() {}
}

enum MyEnumB implements MyInterface {
    X, Y, Z;
    public void someMethod() {}
}

MyInterfaceそして、実装が a だけでなく列挙型であることも要求したいと思います。「標準的な」方法は、交差点の境界によるものです。

static class MyIntersectionClass<T extends Enum<T> & MyInterface> {
    void use(T t) {}
}

しかし、これも機能することがわかりました:

static class MyWildcardClass<T extends Enum<? extends MyInterface>> {
    void use(T t) {}
}

上記で、これはコンパイルされます:

public static void main(String[] args) throws Exception {
    MyIntersectionClass<MyEnumA> a = new MyIntersectionClass<MyEnumA>();
    a.use(MyEnumA.A);
    MyWildcardClass<MyEnumB> b = new MyWildcardClass<MyEnumB>();
    b.use(MyEnumB.X);
}

そして、バウンドは両方のケースで上記で意図され、必要とされているとおりに機能します。

これらの 2 つの境界に違いはありますか?もしそうなら、どちらが「優れている」のでしょうか?

4

4 に答える 4

4

この特定のケースでは、Enums 仮型パラメーターは事実上自己型であるため、違いはありません。これは、次のように Enum から継承できないためです。

class MyEnumA extends Enum<MyEnum2> {}
class MyEnumB implements MyInterface {}

はい、意味的には同じバインドですが、それは Enum であるためです。

于 2013-01-02T13:25:34.320 に答える
3

他の人が指摘したように、両方の構文が同じ境界を達成します。これは、 inがすぐに拡張する型Tでなければならないことがわかっている列挙型の特殊なケースのためだけです。したがって、解決できるものを制限することに違いはありません。Enum<T>enumT

のインスタンスの可能な使用法には違いありますがT、おそらく関係ないほどのニュアンスです。次のステートメントは でコンパイルされますが、 ではコンパイルされMyIntersectionClass.useないことを考慮してMyWildcardClass.useください。

T t2 = t.getDeclaringClass().newInstance();

これらのみが後者でコンパイルされます:

MyInterface t2 = t.getDeclaringClass().newInstance();
Enum<? extends MyInterface> t3 = t.getDeclaringClass().newInstance();
于 2013-01-02T17:48:55.190 に答える
2

2つ目は、Java列挙型がとして実装されるという特別な事実に依存しているMyEnum extends Enum<MyEnum>ため、このような仮定に依存せず、制約を明示的に示す最初の1つをお勧めします。

于 2013-01-02T13:23:17.907 に答える
1

彼らは同じことをしますが、T extends Enum<? extends MyInterface>より一般的かつ迅速に認識できるという理由だけで、もう少し標準的で優れていると思います. &多くの人は、ジェネリックの部分についてさえ知りません。

また、読み方がわずかに異なると主張することもできます。T extends Enum<T> & MyInterface「たまたまMyInterfaceでもある列挙型」と読みます。T extends Enum<? extends MyInterface>「MyInterface を実装する列挙型」と読みます。その程度まで、それは個人的な好みの問題です。私は後者の方が好きです。

于 2013-01-02T13:22:52.183 に答える