1.认识泛型
public class GenericDemo1 {
public static void main(String[] args) {
// 目标:认识泛型,搞清楚使用泛型的好处。
ArrayList list = new ArrayList();
list.add("java");
list.add("php");
list.add(23);
list.add(99.9);
list.add(true);
list.add('a');
list.add(new Object());
// 获取数据。
for (int i = 0; i < list.size(); i++) {
Object rs = list.get(i);
// 把数据转型处理。
String s = (String) rs;
System.out.println(s);
}
}
}
观察上面代码,当处理到整数类型时就会报错.而且每次都要强制转型,麻烦,因此引出泛型
public class GenericDemo1 {
public static void main(String[] args) {
// 目标:认识泛型,搞清楚使用泛型的好处。
ArrayList<String> list = new ArrayList<String>();
list.add("java");
list.add("php");
// list.add(23);
// list.add(99.9);
// list.add(true);
// list.add('a');
// list.add(new Object());
// 获取数据。
for (int i = 0; i < list.size(); i++) {
// Object rs = list.get(i);
// // 把数据转型处理。
// String s = (String) rs;
// System.out.println(s);
String s = list.get(i);
System.out.println(s);
}
}
}
2.泛型接口
//定义学生类
public class Student {
}
public interface Operate<T> {
void add(T t);
void delete(T t);
void update(T t);
T query(int id);
}
public class StudentOperate implements Operate<Student>{
@Override
public void add(Student student) {
}
@Override
public void delete(Student student) {
}
@Override
public void update(Student student) {
}
@Override
public Student query(int id) {
return null;
}
}
public class Test {
public static void main(String[] args) {
StudentOperate studentOperate = new StudentOperate();
studentOperate.add(new Student());
studentOperate.add(new Student());
studentOperate.add(new Student());
}
}
3.泛型方法
public class Test {
public static void main(String[] args) {
String[] strs = {"1", "2", "3"};
Student[] students = new Student[4];
print(strs);
String s = getMax(strs);
Student student = getMax(students);
}
public static <T> void print(T t) {
}
public static <T> T getMax(T[] t) {
return null;
}
}
4.通配符
public class GenericDemo5 {
public static void main(String[] args) {
// 目标:理解通配符和上下限。
ArrayList<Xiaomi> xiaomis = new ArrayList<>();
xiaomis.add(new Xiaomi());
xiaomis.add(new Xiaomi());
xiaomis.add(new Xiaomi());
go(xiaomis);
ArrayList<BYD> byds = new ArrayList<>();
byds.add(new BYD());
byds.add(new BYD());
byds.add(new BYD());
go(byds);
// ArrayList<Dog> dogs = new ArrayList<>();
// dogs.add(new Dog());
// dogs.add(new Dog());
// dogs.add(new Dog());
// go(dogs);
}
// 需求:开发一个极品飞车的游戏。
// 虽然Xiaomi和BYD是Car的子类,但是 ArrayList<Xiaomi> ArrayList<BYD>和 ArrayList<Car> 是没有半毛钱关系!
public static void go(ArrayList<? extends Car> cars) {
}
}
5.泛型支持的类型
那么泛型为什么不支持基本数据类型呢?
来看下面这段代码
// 目标:搞清楚泛型和集合不支持基本数据类型,只能支持对象类型(引用数据类型)。
ArrayList<int> list = new ArrayList<>();
// 泛型擦除:泛型工作在编译阶段,等编译后泛型就没用了,所以泛型在编译后都会被擦除。所有类型会恢复成Object类型
list.add(12);
Object a=12;
特殊方法经过反编译,ArrayList这个类型最终会编译为Object类型,而Object类型必须指向对象
如果支持基本数据类型的话,ArrayList可以加12进去,编译完后,底层是用Object来接,也就意味着你把12交给object,而object只能指向对象,而12不是对象,所以不行
5.1包装类
但是总得用基本数据类型吧,这样就引出了包装类
// 把基本数据类型变成包装类对象。
// 手工包装:
// Integer i = new Integer(100); // 过时
Integer it1 = Integer.valueOf(100); // 推荐的
// 自动装箱成对象:基本数据类型的数据可以直接变成包装对象的数据,不需要额外做任何事情
Integer it11 = 130;
Integer it22 = 130;
System.out.println(it11 == it22);
// 自动拆箱:把包装类型的对象直接给基本类型的数据
int i = it11;
System.out.println(i);
ArrayList<Integer> list = new ArrayList<>();
list.add(130); // 自动装箱
list.add(120); // 自动装箱
int rs = list.get(1); // 自动拆箱
// 1、把基本类型的数据转换成字符串。
int j = 23;
String rs1 = Integer.toString(j); // "23"
System.out.println(rs1 + 1); // 231
Integer i2 = j;
String rs2 = i2.toString(); // "23"
System.out.println(rs2 + 1 ); // 231
String rs3 = j + "";
System.out.println(rs3 + 1 ); // 231
// 2、把字符串数值转换成对应的基本数据类型(很有用)。
String str = "98";
// int i1 = Integer.parseInt(str);
int i1 = Integer.valueOf(str);
System.out.println(i1 + 2);
String str2 = "98.8";
// double d = Double.parseDouble(str2);
double d = Double.valueOf(str2);
System.out.println(d + 2);
标签:String,ArrayList,list,add,-----,泛型,new,public,2Java
From: https://blog.csdn.net/a1209083572/article/details/141369013