ホームページ > Java > &#&チュートリアル > Java 関数の汎用ワイルドカード: 上限と下限

Java 関数の汎用ワイルドカード: 上限と下限

WBOY
リリース: 2024-04-25 16:18:02
オリジナル
699 人が閲覧しました

Java では、汎用ワイルドカードを使用して、特定の型を指定せずに汎用型を表すことができます。上限のワイルドカード文字 ( extends T>) は型パラメータ T またはそのサブクラスを表し、サブクラス データをリスト内で受け入れることができます。下部のワイルドカード文字 ( super T>) は T またはそのスーパークラスを表し、リスト内のスーパークラス データを受け入れることができます。ワイルドカードを使用すると、ジェネリックスを使用してサイズ変更可能な配列リストを実装でき、さまざまな型や追加/削除操作を処理できるようになります。

Java 函数中的泛型通配符:上限和下限

Java 関数のジェネリック ワイルドカード: 上限と下限

Java では、ワイルドカードを使用してジェネリック型を表すことができ、具体的な型を指定せずにジェネリックを使用できるようになります。この記事では、上位および下位のワイルドカードについて説明し、実際の例を通じてその使用法を示します。

キャップ付きワイルドカード

キャップ付きワイルドカード (<? extends T>) は、型パラメーター T またはそのサブクラスのいずれかを表します。例: <? extends T>) 表示类型参数 T 或其任何子类。例如:

public static <T extends Number> double sum(List<T> numbers) {
  double total = 0;
  for (T num : numbers) {
    total += num.doubleValue();
  }
  return total;
}
ログイン後にコピー

此函数可以接受任何 Number (如 Integer、Double) 或其子类的列表。我们可以安全地将任何满足 Number 约束的列表传递给此函数,如下所示:

List<Integer> ints = List.of(1, 2, 3);
double sumIntegers = sum(ints); // 编译通过
ログイン後にコピー

下限通配符

下限通配符 (<? super T>) 表示类型参数 T 或其任何超类。例如:

public static <T super Number> void process(List<T> entities) {
  for (T entity : entities) {
    System.out.println(entity.getClass().getName());
  }
}
ログイン後にコピー

此函数可以接受任何 Number 的超类 (如 Object、Serializable) 的列表。我们可以安全地将任何满足 Number 超类约束的列表传递给此函数,如下所示:

List<Object> objects = List.of("Hello", 123);
process(objects); // 编译通过
ログイン後にコピー

实战案例

考虑一个可调整大小的数组列表,我们可以使用泛型通配符来实现它:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class ResizableArrayList<E> {

  private List<E> list;

  public ResizableArrayList() {
    this(new ArrayList<>());
  }

  public ResizableArrayList(List<? super E> initialList) {
    list = new ArrayList<>(initialList);
  }

  public void addAll(List<? extends E> elements) {
    list.addAll(elements);
  }

  public void removeAll(List<? super E> elements) {
    list.removeAll(elements);
  }

  public List<E> getList() {
    return list;
  }

  public static void main(String[] args) {
    ResizableArrayList<Integer> numbers = new ResizableArrayList<>(
        Arrays.asList(1, 2, 3)
    );
    numbers.addAll(Arrays.asList(4, 5, 6));
    numbers.removeAll(Arrays.asList(2, 3));

    System.out.println(numbers.getList()); // [1, 4, 5, 6]
  }
}
ログイン後にコピー

这个可调整大小的数组列表可以处理任何类型 Errreee

この関数は、任意の数値 (Integer、Double など) またはそのサブクラスのリストを受け入れることができます。次のように、Number 制約を満たす任意のリストをこの関数に安全に渡すことができます: 🎜rrreee🎜🎜下位ワイルドカード🎜🎜🎜下位ワイルドカード (<? super T>) は型パラメータ を表します。 T またはそのスーパークラスのいずれか。例: 🎜rrreee🎜 この関数は、任意の Number スーパークラス (Object、Serializable など) のリストを受け入れることができます。次のように、Number スーパークラスの制約を満たす任意のリストをこの関数に安全に渡すことができます: 🎜rrreee🎜🎜 実用的な例 🎜🎜🎜 サイズ変更可能な配列リストを考えてみましょう。それを実現するには、汎用のワイルドカードを使用できます: 🎜rrreee🎜このサイズ変更可能な配列リストは、任意の typeE を処理し、さまざまなオブジェクトをリストに追加または削除できるようにします。 🎜

以上がJava 関数の汎用ワイルドカード: 上限と下限の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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