ホームページ  >  記事  >  Java  >  Javaで制限された型パラメータを定義する方法

Javaで制限された型パラメータを定義する方法

coldplay.xixi
coldplay.xixi転載
2020-08-22 17:14:523216ブラウズ

Javaで制限された型パラメータを定義する方法

[関連する学習の推奨事項: 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 サイトの他の関連記事を参照してください。

声明:
この記事はjb51.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。