ホームページ >Java >&#&チュートリアル >Java ジェネリックでクラスとインターフェイスの境界を結合するにはどうすればよいですか?

Java ジェネリックでクラスとインターフェイスの境界を結合するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-05 22:58:10501ブラウズ

How Can I Combine Class and Interface Bounds in Java Generics?

Java ジェネリック: クラスとインターフェイスの境界の結合

Java では、ジェネリックは、さまざまなタイプのオブジェクトで動作できる型を定義する機能を提供します。 。特定のインターフェイスの実装中に、特定のクラスの拡張に制限されたクラス オブジェクトを作成する場合、一般的な課題が発生します。

クラスを作成するユースケースを考えてみましょう。 ClassA を拡張し、InterfaceB を実装するクラスを表すオブジェクト

両方を実行することはできませんか?

最初は、次のワイルドカードを使用してみてください:

Class<? extends ClassA>

または

Class<? extends InterfaceB>

ただし、これらのいずれかを使用しても、両方の要件を同時に適用することはできません。

A解決策

これを達成するための鍵は、ワイルドカードで複数の境界を使用することです。このようなワイルドカードの構文は次のとおりです。

<T extends Class & Interface>

これをシナリオに適用すると、次のようになります。

Class<? extends ClassA & InterfaceB>

境界型パラメータ

Java ジェネリックで説明されているようにチュートリアルでは、複数の境界を使用して、型パラメーターが特定のクラスを拡張し、1 つ以上のインターフェイスを実装する必要があることを指定できます。 & 演算子を使用すると境界が区切られます。

複雑な例

このソリューションでは目標を達成できますが、複雑になる可能性があります。たとえば、Java の Collections#max メソッドについて考えてみましょう。このメソッドには次の宣言があります:

public static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)

この高度な構文により、特定の型制約を強制しながらバイナリ互換性が保証されます。

ジェネリック クラスの使用

ユースケースでは、必要な機能を備えたジェネリック クラスを作成できます。 bounds:

public class MyClass<T extends ClassA & InterfaceB> {
    Class<T> variable;
}

このアプローチでは、次のような必要な制限を持つ変数を作成できます。

MyClass<ClassB>.variable

以上がJava ジェネリックでクラスとインターフェイスの境界を結合するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。