public class Generic01 {public static void main(String[] args){ArrayList arrayList = new ArrayList();arrayList.add(new Dog("scott",4));arrayList.add(new Dog("jack",5));arrayList.add(new Dog("mary",6));for(Object o : arrayList) {Dog dog = (Dog) o;//获取对象的名字System.out.println(dog.getName());}}
}
class Dog {private String name;private int age;public Dog(String name, int age) {this.name = name;this.age = age;}public void setName(String name) {this.name = name;}public String getName() {return name;}public void setAge(int age) {this.age = age;}public int getAge() {return age;}
}
public class Generic01 {public static void main(String[] args){ArrayList arrayList = new ArrayList();arrayList.add(new Dog("scott",4));arrayList.add(new Dog("jack",5));arrayList.add(new Dog("mary",6));//arrayList.add(new Cat("招财猫",3));for(Dog dog : arrayList) {System.out.println(dog.getName());}}
}
不使用泛型:放入到ArrayList会先转成Object,在取出时,再转换成Dog;
使用泛型:放入和取出时,不需要类型转换;
| 不使用泛型 | 使用泛型 |
|---|---|
| 放入到ArrayList会先转成Object,在取出时,再转换成Dog; | 放入和取出时,不需要类型转换; |
| 泛型 | Generic |
|---|---|
| 参数的类型 | $1600 |
| 类中方法返回值的类型 | $12 |
| 属性的类型 | $1 |
- 在这里,E的类型一定要清楚的知道,可以通过getClass()方法得到;
- 注意:E具体的数据类型在定义Person对象时指定,即在编译期间就已确定类型;


- interface List
{}, public class HashSet {};
T,E只能是引用类型,不能用基本数据类型;(Type argument cannot be of primitive type)
- 在给泛型指定具体类型后,可以传入该类型或其子类类型;
- 泛型的简写形式:省略构造器处的泛型表示,编译器会进行类型推断;
Listlist = new ArrayList<>(); - 如果没有指定泛型,默认泛型是Object;
Map hashMap = new HashMap();
等价于
Map

改进后:封装后代码复用性更高;


public class CustomGeneric {public static void main(String[] args) {//T是Double,R是String,M是IntegerTiger tiger = new Tiger<>("john~~");tiger.setT(3.2);//OKSystem.out.println(tiger);Tiger tiger1 = new Tiger("john");//tiger.setT("yy");因为T是Object,"yy"是 Object子类,类型不对}
}
//1.Tiger后面有泛型,所以我们把Tiger 称为自定义泛型类
//2.T, R, M 泛型的标识符,一般是单个大写字母
//3.泛型的标识符可以有多个
//4.普通成员可以使用泛型 (属性、方法)
//5.使用泛型的数组,不能初始化
class Tiger {String name;T t;//属性使用到泛型M m;R r;public Tiger(String name) {this.name = name;}//Type parameter 'T' cannot be instantiated directly//T[] ts = new T[8];类型不能确定,无法分配空间,因为数组在new的时候不能确定T的类型,就无法在内存开辟空间public Tiger(T t, M m, R r) {//构造器使用泛型this.t = t;this.m = m;this.r = r;}//因为静态是和类相关的,在类加载时,对象还没有创建//所以,如果静态方法和静态属性使用了泛型,JVM就无法完成初始化/*static R r2;public static void m1(M m) {//cannot be referenced from a static context}*///方法使用泛型public String getName() {return name;}public void setName(String name) {this.name = name;}public T getT() {return t;}public void setT(T t) {this.t = t;}public M getM() {return m;}public void setM(M m) {this.m = m;}public R getR() {//返回类型可以使用泛型return r;}public void setR(R r) {//方法使用到泛型this.r = r;}
}
基本语法:interface 接口名
/*** 泛型接口使用说明* 1.接口中,静态成员不能使用泛型* 2.泛型接口的类型是在继承接口或者实现接口时实现的*///1.在继承接口时,指定泛型接口的类型
interface IA extends IUsb {}
//当我们去实现IA接口时,因为IA在继承IUsb接口时,指定了U为String,R为Double
// 因此在实现IUsb接口方法时,使用String替换U,Double替换R
class AA implements IA {@Overridepublic Double get(String s) {return null;}@Overridepublic void hi(Double aDouble) {}@Overridepublic void run(Double r1, Double r2, String u1, String u2) {}
}
//2.实现接口时,直接指定泛型接口的类型
//给U指定了Integer, 给R指定了Float
//所以当实现IUsb接口方法时,会使用Integer替换U,Float替换R
class BB implements IUsb {@Overridepublic Float get(Integer integer) {return null;}@Overridepublic void hi(Float aFloat) {}@Overridepublic void run(Float r1, Float r2, Integer u1, Integer u2) {}
}//3.没有指定泛型,就默认为Object
//等价于class CC implements IUsb
基本语法:修饰符[空格]
public class CustomMethodGeneric_ {public static void main(String[] args) {Car car = new Car();//2. 当泛型方法被调用时,泛型类型就会确定,否则调用不起来;car.fly("宝马",1200);//当调用方法时,传入参数,编译器就会确定类型System.out.println("===========");car.fly(2.2,1200);//当调用方法时,传入参数,编译器就会确定类型System.out.println("===========");//T:Sring, R:ArrayListFish fish = new Fish<>();//K:Floatfish.hello(new ArrayList(), 2.1f);}
}
//1.泛型方法,可以定义在普通类中
class Car {//普通类public void run() {//普通方法}//说明:泛型方法// 就是泛型// 提供给fly方法使用的public void fly(T t, R r) {//泛型方法System.out.println(t.getClass());//StringSystem.out.println(r.getClass());//Integer}
}
//2.泛型方法,也可以定义在泛型类中
class Fish {//泛型类public void run() {//普通方法}public void fly(U u, M m) {//泛型方法}//说明// hi()方法不是一个泛型方法// 只是hi()方法使用了类声明的泛型public void hi(T e) {}//泛型方法,可以使用类声明的泛型,也可以使用自己声明的泛型public void hello(R r, K k) {System.out.println(r.getClass());//ArrayListSystem.out.println(k.getClass());//Float}
}
public class CustomMethodGenericExercise {public static void main(String[] args) {//T:String, R:Integer, M:DoubleApple apple = new Apple<>();apple.fly(10);//泛型都是引用类型,所以10自动装箱,输出:Integerapple.fly(new Dog());//输出:Dog}
}class Apple {public void fly(E e) {//.getClass():显示包名+类名; //.getClass().getSimpleName():只显示类名System.out.println(e.getClass().getSimpleName());}//public void eat(U u) {} //错误,U没有声明public void eat(U u) {} //改正public void run(M m) {}}
class Dog {}
| 通配符 | 作用 |
|---|---|
| List> c | 表示可以接收任意范型类型 |
| List<? extends A> c | 表示可以接收A类或者A类的子类,规定泛型上限 |
| List super A> c | 表示可以接收A类或者A类的父类(不限于直接父类),规定泛型下限 |
@SuppressWarnings({"all"})
public class GenericExtends {public static void main(String[] args) {//范型没有继承性//List
shortcuts: Alt+Enter/option+Enter
可以直接运行一个方法,JUnit测试框架;

public class JUnit_ {public static void main(String[] args) {//new JUnit_().m1();//new JUnit_().m2();}@Testpublic void m1() {System.out.println("m1()方法");}@Testpublic void m2() {System.out.println("m2()方法");}
}
public class Homework01 {public static void main(String[] args) {}@Testpublic void test() {//这里我们给泛型T指定的类型是UserDAO userDAO = new DAO<>();userDAO.save("No1", new User(1, 22));userDAO.save("No2", new User(2, 23));userDAO.save("No3", new User(3, 23));List list = userDAO.list();userDAO.update("No3", new User(3, 18));list = userDAO.list();userDAO.delete("No3");list = userDAO.list();User user = userDAO.get("No2");System.out.println(list);System.out.println(user.getAge());}
}class DAO {private Map map = new HashMap<>();public void save(String id, T entity) {map.put(id, entity);}public T get(String id) {return map.get(id);}public void update(String id, T entity) {map.put(id, entity);}public List list() {List arrayList = new ArrayList<>();Set keySet = map.keySet();Iterator iterator = keySet.iterator();while (iterator.hasNext()) {String key = iterator.next();arrayList.add(get(key));}return arrayList;}public void delete(String id) {map.remove(id);}
}
class User {private int id;private int age;public User(int id, int age) {this.id = id;this.age = age;}public int getId() {return id;}public void setId(int id) {this.id = id;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "\nUser{" +"id=" + id +", age=" + age +'}';}
}
下一篇:刚刚!格力报警后续来了