Java泛型
泛型類
即把不確定的資料元素型別用一個泛型占位符表示
@Data
public class Person<T> {
private T name;
private T address;
}
Person<String> person= new Person<>();
person.setName("attack204");
System.out.println(person.getName());
多型別泛型
即需要傳遞多個型別占位符,一個常見的應用是map
@Data
public class MyMap<K, V> {
private K key;
private V value;
public void setKeyAndValue(K key, V value) {
this.key = key;
this.value = https://www.cnblogs.com/attack204/p/value;
}
}
MyMap<String, Integer> myMap = new MyMap<>();
myMap.setKeyAndValue("attack204", 2333);
System.out.println(myMap.getKey());
System.out.println(myMap.getValue());
普通方法泛型
@Data
public class Person<T> {
private T name;
private T address;
//以下兩種方法都可以
public String show(T inputName) {
return inputName + "is showing";
}
public <E> String show2(E input) {
return input + "is showing two";
}
}
Person<String> person = new Person<>();
System.out.println(person.show("attack204"));
System.out.println(person.show2("attack203"));
靜態方法泛型
@Data
public class Person<T> {
private T name;
private T address;
//注意,靜態方法只能呼叫靜態變數,T不是靜態變數
//因此不能寫成 public static String show(T inputName) {
public static <E> String show(E inputName) {
return inputName + "is showing";
}
}
System.out.println(Person.show("attack204"));
泛型介面
和上面差不多一樣
- interface
public interface PersonInt<T> {
public String show(T name);
}
- implement
public class PersonImpl implements PersonInt<String> {
@Override
public String show(String name) {
return name + "is showing three";
}
}
或者
public class PersonImpl<T> implements PersonInt<T> {
@Override
public String show(T name) {
return name + "is showing three";
}
}
- main
PersonImpl person = new PersonImpl();
System.out.println(person.show("attack204"));
或者
PersonImpl<String> person = new PersonImpl<>();
System.out.println(person.show("attack204"))
擦除模式
- 定義:java中的泛型只存在于編譯階段,在反射階段會被擦除,
考慮這樣一段代碼
Person<String> p = new Person<>();
Person<Integer> p1 = new Person<>();
system.out.println(p == p1);
//true
- 目的:為了兼容低版本的jdk
通配符
在泛型中不識別父子繼承關系(具體見視頻)
因此需要通配符<?>來解決此錯誤
上邊界與下邊界
用了<?>相當于此處可以是任意型別,但是有時候需要對其進行限定
<? extends T>表示只能傳入T及其子類,需要讀取,但不寫入時使用
<? super T> 表示只能傳入T及其父類,需要寫入,但不讀取時使用
參考資料
b站視頻
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/266896.html
標籤:Java
