package Demo_1_25_泛型;
public class Point { // T是Type的简写,可以定义多个泛型,如果没有定义则默认为Object类型,因为Object类可以接收所有数据类型参数。
private T x;
private T y;
public T getX() {
return x;
}
public void setX(T x) {
this.x = x;
}
public T getY() {
return y;
}
public void setY(T y) {
this.y = y;
}
}
package Demo_1_25_泛型;
public class Main {
public static void main(String[] args) {
Point point = new Point<>(); // 此时point对象中的参数全部为Integer类型,泛型定义只能设置引用类型Integer,而不能是int
Point point1 = new Point<>(); // 此时point1对象中的参数全部为String类型
point.setX(12); // 自动装箱为Integer类型
int a = point.getX(); // 拆箱:向下转型为int类型
System.out.println(a);
}
}
通配符概念:
package Demo_1_25_泛型2;
public class Message { // T是Type的简写,可以定义多个泛型,定义后所有参数都是T类型
private T content;
public Message() {
}
public Message(T content) {
this.content = content;
}
public T getContent() {
return content;
}
public void setContent(T content) {
this.content = content;
}
}
package Demo_1_25_泛型2;
public class Main {
public static void main(String[] args) {
Message msg1 = new Message<>();
msg1.setContent(11);
func(msg1); // 传入泛型为Integer类型的引用
/*
puvlic static void fun(Message msg){}
但是有问题,上述方法应该可以所接受任意类型的泛型参数。此时只能接收String类型,而不能接收其它类型
所以需要通配符?来定义方法中的泛型
在 ? 这个通配符的基础之上还有两种小的通配符:
?extends 类名 :设置泛型的上限
表示该泛型只允许定义类名或类名的子类类型
例如:?extends Number :表示该泛型类型值允许设置Number或Number的子类
?super 类名 :设置泛型的下限
例如:?super String 只能使用String类或其父类类型
*/
Message msg = new Message<>();
msg.setContent("www.baidu.com");
func1(msg); // 传入泛型为String类型的引用
}
// public static void func(Message msg){};
// msg.setContent(1.2); // 如果没有泛型,就可以在方法中随意修改数据,极其不安全
public static void func(Message <?extends Number> msg) { // 设置泛型的上限:表示该泛型类型值允许设置Number或Number的子类
// 当传入泛型类型不是(Number或Number的子类)的引用时无法使用此方法
System.out.println(msg.getContent());
}
public static void func1(Message<?super String> msg) { // 设置泛型的下限
// 当传入泛型类型不是(String或String的父类)的引用时无法使用此方法
System.out.println(msg.getContent());
}
}