演示代碼:
package exercise;import java.util.Arrays;public class MyArrayList<E> {Object[] obj = new Object[10];int size;public boolean add(E e) {obj[size] = e;size++;return true;}public E get(int index) {return (E) obj[index];}//沒有這個函數,無法看到obj內部的值public String toString() {return Arrays.toString(obj);}
}
測試:
package exercise;public class Test {public static void main(String[] args) {MyArrayList<String> list = new MyArrayList<>();list.add("sunshine");list.add("jiuselu");list.add("kukuhsui");System.out.println(list);System.out.println(list.get(0));}
}
代碼演示:
package exercise;import java.util.ArrayList;public class ListUtil {private ListUtil() {}//泛型要寫在修飾符后,public、static都是,寫在后面的修飾符后。public static <E> void addAll(ArrayList<E> list, E e1, E e2, E e3, E e4) {list.add(e1);list.add(e2);list.add(e3);list.add(e4);}//可以實現任意參數加入集合public static<E> void addAll1(ArrayList<E> list,E...e){for (E element : e) {list.add(element);}}}
測試類:
package exercise;import java.util.ArrayList;public class Test {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();ListUtil.addAll(list,"sunshine","jiuselu","lulushui","zechao");System.out.println(list);ArrayList<String> list1 = new ArrayList<>();ListUtil.addAll1(list1,"sunshine");System.out.println(list1);}
}
代碼演示:
方法一:
方法二:
package exercise;public class Test {public static void main(String[] args) {//泛型接口的兩種使用方式//1.實現類給出的具體類型MyArrayList list = new MyArrayList();list.add("sunshine");//2.實現類延續泛型,創建實現類對象時再確定類型MyArrayList1<String> list1 = new MyArrayList1<>();list1.add("jiuselu");}
}
package exercise;import java.util.ArrayList;public class Demo1 {public static void main(String[] args) {//泛型不具備繼承性,但數據具備繼承性ArrayList<Ye> list1 = new ArrayList<>();ArrayList<Fu> list2 = new ArrayList<>();ArrayList<Zi> list3 = new ArrayList<>();method1(list1);method1(list2);method1(list3);list1.add(new Ye());list1.add(new Fu());list1.add(new Zi());method2(list1);method2(list2);method2(list3);}/*此時,泛型里面寫的是什么類型,那就只能傳遞什么類型的數據弊端:利用泛型方法有一個小弊端,它可以接受任意類型數據比如 Ye Fu Zi希望:本方法雖然不確定類型,但是我希望洗后只傳遞Ye Fu Zi此時,我們就可以使用泛型的通配符:?:表示不確定的類型它可以進行類型的限定? extend E :表示可以傳遞E或者E所有子類類型? super E :表示可以傳遞E和E的所有父類類型應用場景:1.如果我們在定義類、方法、接口的時候,如果類型不確定,就可以定義泛型類、泛型方法、泛型接口。2.如果類型不確定,但是能知道以后只能傳遞某個繼承體系中的,就可以使用泛型的通配符泛型的通配符:關鍵點:可以限定類型的范圍*/public static void method1(ArrayList<? extends Ye> list) {}public static void method2(ArrayList<? super Zi> list) {}
}class Ye {
}class Fu extends Ye {
}class Zi extends Fu {
}
補充;一個<>中可以寫多個類型
案例
package exercise;import javax.swing.*;
import javax.swing.plaf.synth.SynthTextAreaUI;
import javax.swing.text.AbstractDocument;
import java.util.ArrayList;
import java.util.List;public class Demo2 {public static void main(String[] args) {ArrayList<ChineseCat> list1 = new ArrayList<>();ArrayList<PersianCat> list2 = new ArrayList<>();ArrayList<HuskyDog> list3 = new ArrayList<>();ArrayList<Teddy> list4 = new ArrayList<>();keepPet1(list1);keepPet1(list2);keepPet2(list3);keepPet2(list4);}public static void keepPet1(ArrayList<? extends Cat> list) {}public static void keepPet2(ArrayList<? extends Dog> list) {}public static void keepPet3(ArrayList<? extends Animal> list) {}
}abstract class Animal {private String name;private int age;public abstract void eat();public Animal() {}public Animal(String name, int age) {this.name = name;this.age = age;}/*** 獲取** @return name*/public String getName() {return name;}/*** 設置** @param name*/public void setName(String name) {this.name = name;}/*** 獲取** @return age*/public int getAge() {return age;}/*** 設置** @param age*/public void setAge(int age) {this.age = age;}public String toString() {return "Animal{name = " + name + ", age = " + age + "}";}
}abstract class Cat extends Animal {//1.繼承抽象類,重寫里面所有的方法。//2.本身cat也是一個抽象的,讓Cat的子類在重寫方法//此時采取第二種處理方案//因為貓的兩個子類中的eat的方法體還是不一樣的
}class PersianCat extends Cat {public void eat() {System.out.println("一只叫做" + this.getName() + "的" + this.getAge() + "歲的波斯貓,正在吃小餅干。");}
}class ChineseCat extends Cat {public void eat() {System.out.println("一只叫做" + this.getName() + "的" + this.getAge() + "歲的貍花貓,正在吃魚。");}
}abstract class Dog extends Animal {
}class Teddy extends Dog {@Overridepublic void eat() {System.out.println("一只叫做" + getName() + "的," + getAge() + "歲的泰迪,正在吃骨頭,邊吃邊蹭");}
}class HuskyDog extends Dog {@Overridepublic void eat() {System.out.println("一只叫做" + getName() + "的," + getAge() + "歲的哈士奇,正在吃骨頭,邊吃邊拆家");}
}