Java でジェネリックを使用する場合、特定のクラスを拡張するためにジェネリック クラスの型を制限する必要が生じる場合があります。クラスを作成し、特定のインターフェイスを実装します。次の試みが成功すると期待するのは合理的だと思われます:
Class<? extends ClassA>
Class<? extends InterfaceB>
残念ながら、一度に適用できるのはこれらのうち 1 つだけです。では、2 つの制限をどのように組み合わせることができるでしょうか?
実際には、次を使用して、ジェネリック型パラメーターで複数のインターフェイス、またはクラスとインターフェイスを指定することができます。 "&":
<T extends ClassA & InterfaceB>
これにより、指定されたクラスの拡張と、指定されたクラスの実装の両方に制限されるジェネリック型を定義できます。
たとえば、クラス ClassB とインターフェイス InterfaceC を定義すると、次のように汎用クラスを作成できます。
class MyClass<T extends ClassB & InterfaceC> { Class<T> variable; }
これにより、MyClass の変数フィールドは、 ClassB を拡張し、InterfaceC を実装するクラスへの参照を保持します。
この機能はジェネリック型を定義するための柔軟性を提供しますが、Collections#max:
public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
の JavaDoc 宣言に見られるように、複雑な宣言につながる可能性もあります。この複雑さは、バイナリ互換性を考慮することによって発生します。ただし、この複雑さは主に、ジェネリック変数を宣言するときではなく、ジェネリック クラスまたはメソッドを定義するときに発生することに注意することが重要です。
したがって、特定のクラスを拡張するクラス オブジェクトを作成するという目標を達成するには、特定のインターフェイスを実装する場合は、次のアプローチを使用できます。
class classB { } interface interfaceC { } public class MyClass<T extends classB & interfaceC> { T variable; }
これにより、変数フィールドに必要な制限が与えられます。私のクラス。
以上がJava 汎用クラスを制限して、クラスの拡張とインターフェイスの実装を同時に行うにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。