1. 如果没有泛型
集合中的元素类型就是用泛型规范的,如果没有泛型,集合中的元素类型就不确定,所以需要在处理前进行判断,很麻烦。
package com.basic;
import java.util.ArrayList;
import java.util.List;
public class Demo {
public static void main(String[] args) {
List list = new ArrayList();
list.add(true);
list.add(123);
list.add(23);
list.add("a");
// 求 list 集合中数字的和
int sum = 0;
for (Object o : list) {
if (o instanceof Integer) { // 进行 Integer 类型判断
Integer i = (Integer)o;
sum += i;
}
}
System.out.println(sum);
}
}
2. 创建带泛型的类
在创建类时某些数据类型是不确定的,只有在创建对象的时候才确定,这时我们创建带泛型的类。
类上的泛型,是作用在成员变量和成员方法上的。
package com.basic;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Point<T> {
private T x;
private T y;
}
package com.basic;
public class Demo {
public static void main(String[] args) {
Point<Integer> p1 = new Point<>();
p1.setX(2);
p1.setY(10);
System.out.println(p1);
Point<Double> p2 = new Point<>();
p2.setX(2.19);
p2.setY(3.981);
System.out.println(p2);
Point<String> p3 = new Point<>();
p3.setX("东经45度");
p3.setY("北纬45度");
System.out.println(p3);
}
}
可以在类上一次性声明多个泛型
package com.basic;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Point<T1, T2> {
private T1 x;
private T2 y;
}
package com.basic;
public class Demo {
public static void main(String[] args) {
Point<String, Integer> p = new Point<>();
p.setX("东经45度");
p.setY(5);
System.out.println(p);
}
}
3. 静态方法中的泛型
声明在类上的泛型,不能在静态方法中使用,因为类上面声明的泛型是创建对象的时候确定的。但是静态方法不用创建对象直接调用。所以静态方法的泛型要单独声明。
package com.basic;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Point<T1, T2> {
private T1 x;
private T2 y;
public static <M1, M2> void getType(M1 x, M2 y) {
System.out.println(x);
System.out.println(y);
}
}
package com.basic;
public class Demo {
public static void main(String[] args) {
Point.getType("东经25度", 35);
}
}
4. 泛型作用在接口上
和作用在类上相似,接口在写实现类的时候确定泛型的类型
interface 接口名 <T1, T2> {
}
实现类
class 实现类 implements 接口名 <具体的数据类型> {
}
5. 泛型的限定
? :通配符,任意类型,代表可以存储任意类型的数据
List<?> list = new ArrayList<>(); // 代表集合中可以存储任意类型的数据
? extends E:限定了上限,泛型必须是 E 以及 E 的子类。
? super E:限定了下限,泛型必须是 E 以及 E 的父类。