[関連する学習の推奨事項: java 基本チュートリアル ]
場合によっては、型パラメータとして使用できる型を制限したい場合があります。パラメータ化されたタイプ。たとえば、数値を操作するメソッドは、Number またはそのサブクラスの 1 つのインスタンスのみを受け入れたい場合があります。それが、有界型パラメータの目的です。
制限されたパラメーター型のメソッドの例
境界付き型パラメーターを宣言するには、型パラメーターの名前をリストし、その後に extends キーワード、その上限を続けます。この場合、Number
この場合、extends は通常、「拡張」(クラスの場合) または「実装」(インターフェイスの場合) を意味するために使用されることに注意してください。
package generics; /** * 定义受限制的方法 * * @author psdxdgK1DT * */ public class Box<T> { private T t; public void set(T t) { this.t = t; } public T get() { return t; } /** * 通过修改我们的通用泛型方法以包含此有界类型参数,现在编译将失败,因为我们对inspect的调用仍包含String: * By modifying our generic method to include this bounded type parameter * compilation will now fail, since our invocation of inspect still includes a String: * inspect:单词:检查 * @param <U> * @param u */ public <U extends Number> void inspect(U u) { System.out.println("T:" + t.getClass().getName()); System.out.println("U:" + u.getClass().getName()); } public static void main(String[] args) { Box<Integer> integerBox = new Box<Integer>(); integerBox.set(new Integer("some text")); integerBox.inspect("some test");这里会出现预编译错误 integerBox.inspect(10); } }
コンパイル エラーを示す赤い波線がディスプレイに表示されます
コンパイルが強制されると、エラーが報告されます:
プログラムの実行結果:
スレッド「メイン」java.lang.Error での例外: 未解決のコンパイルの問題: Box 型のメソッド Inspection(U) は引数 (文字列) には適用できません。 )
at generics.Box.main(Box.java:36)
翻訳:
未解決のコンパイル エラー
Box クラス Inspection(U) メソッドは、(String) 型パラメーターには適用できません\
制限された型パラメーターを使用するクラスは、制限された境界メソッドを呼び出すことができます
例外制限ジェネリック型の型をインスタンス化することに加えて、境界型パラメーターを使用すると、境界で定義されたメソッドを呼び出すこともできます。
//使用受限类型参数的类 public class NaturalNumber<T extends Integer> { private T n; public NaturalNumber(T n) { this.n = n; } public boolean isEven() { return n.intValue() % 2 == 0; } // ...
isEven メソッドは、n を介して Integer クラスで定義された intValue メソッドを呼び出します。
複数の境界
前の例は、単一の境界を持つ型パラメーターの使用を示していますが、型パラメーターには複数の境界を持つことができます。
dee20d5a101ff37576d3dea788a52029 複数の境界を持つ型変数は、その境界にリストされているすべての型のサブタイプです。境界の 1 つがクラスである場合は、それを最初に指定する必要があります。例:クラス A { /* … / } インターフェイス B { / … / } インターフェイス C { / … */ }クラス D 6790247218b9dc5784654575b96adc6d { /* … */ } バインドされた A が最初に指定されていない場合は、コンパイル時エラーが発生します:class D b08ac1cb90d2575d3d2e6d9d9e86e32d { /* … */ } // コンパイル時エラー
汎用アルゴリズム
有界型パラメーターは、汎用アルゴリズムを実装するための鍵です。指定された要素 elem より大きい配列 T[] 内の要素の数を数える次のメソッドを考えてみましょう。public static <T> int countGreaterThan(T[] anArray, T elem) { int count = 0; for (T e : anArray) if (e > elem) // compiler error ++count; return count; } The implementation of the method is straightforward, but it does not compile because the greater than operator (>) applies only to primitive types such as short, int, double, long, float, byte, and char. You cannot use the > operator to compare objects. To fix the problem, use a type parameter bounded by the Comparable<T> interface: public interface Comparable<T> { public int compareTo(T o); } The resulting code will be: public static <T extends Comparable<T>> int countGreaterThan(T[] anArray, T elem) { int count = 0; for (T e : anArray) //因为这里的T是受限制的类型参数,实现了Comparable接口,于是可以使用接口的方法compareTo if (e.compareTo(elem) > 0) ++count; return count; }
関連する学習に関する推奨事項:
以上がJavaで制限された型パラメータを定義する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。