Rumah  >  Artikel  >  Java  >  Kad bebas generik dalam fungsi Java: sempadan atas dan bawah

Kad bebas generik dalam fungsi Java: sempadan atas dan bawah

WBOY
WBOYasal
2024-04-25 16:18:02657semak imbas

Di Java, kad bebas generik membenarkan mewakili jenis generik tanpa menyatakan jenis tertentu. Aksara kad bebas sempadan atas (9d2765459de79669203dc2fefe6ee69e) mewakili jenis parameter T atau mana-mana subkelasnya, membenarkan data subkelas diterima dalam senarai. Aksara kad bebas yang lebih rendah (117c5a0bdb71ea9a9d0c2b99b03abe3e) mewakili T atau mana-mana kelas supernya, membenarkan data superclass dalam senarai diterima. Kad bebas boleh digunakan untuk melaksanakan senarai tatasusunan boleh ubah saiz dengan generik, membenarkan pengendalian pelbagai jenis dan operasi penambahan/penyingkiran.

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

Kad Liar Generik dalam Java Fungsi: Sempadan Atas dan Bawah

Di Jawa, kami boleh menggunakan kad bebas untuk mewakili jenis generik, membolehkan kami menggunakan generik tanpa menyatakan jenis konkrit. Artikel ini akan meneroka kad bebas atas dan bawah dan menunjukkan penggunaannya melalui contoh praktikal.

Kad bebas berhad

Kad bebas berhad (b15e13d18d38f01f29be76606db8e6d8) mewakili parameter jenis T atau mana-mana subkelasnya. Contohnya: d203bb1ae585225d4838a2b7e3d0503e) 表示类型参数 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); // 编译通过

下限通配符

下限通配符 (117c5a0bdb71ea9a9d0c2b99b03abe3e) 表示类型参数 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

Fungsi ini boleh menerima sebarang Nombor (seperti Integer, Double) atau senarai subkelasnya. Kami boleh lulus mana-mana senarai dengan selamat yang memenuhi kekangan Nombor untuk fungsi ini seperti berikut: 🎜rrreee🎜🎜Lower wildcard🎜🎜🎜Lower wildcard (117c5a0bdb71ea9a9d0c2b99b03abe3e) mewakili jenis parameter T atau mana-mana kelas supernya. Contohnya: 🎜rrreee🎜Fungsi ini boleh menerima senarai mana-mana superclass Nombor (seperti Object, Serializable). Kita boleh lulus mana-mana senarai yang memenuhi kekangan superclass Number kepada fungsi ini dengan selamat seperti berikut: 🎜rrreee🎜🎜 Contoh praktikal 🎜🎜🎜 Pertimbangkan senarai tatasusunan boleh ubah saiz, kita boleh menggunakan kad bebas generik untuk mencapainya: 🎜rrreee🎜Senarai tatasusunan boleh resiz ini boleh resizable mengendalikan sebarang jenisE, membenarkan kami menambah atau mengalih keluar pelbagai objek pada senarai. 🎜

Atas ialah kandungan terperinci Kad bebas generik dalam fungsi Java: sempadan atas dan bawah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn