ホームページ > Java > &#&チュートリアル > Java 汎用クラスを制限して、クラスの拡張とインターフェイスの実装を同時に行うにはどうすればよいですか?

Java 汎用クラスを制限して、クラスの拡張とインターフェイスの実装を同時に行うにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-08 02:44:15
オリジナル
489 人が閲覧しました

How Can I Restrict a Java Generic Class to Extend a Class and Implement an Interface Simultaneously?

クラスとインターフェイスを備えた Java ジェネリック

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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート