目录
泛型
泛型的引入
坐标类Point {
x
y
}
背景:
坐标类取值有很多种可能。
比如:10.1,20.1都是double型
东经101度,北纬32度 是字符串型
11,32都是整型
当x和y不小心设置为不同的类型时,在进行强制类型转换时,就会发生运行时异常(类型转换异常),强转发生的,这个错误是在编译期无法发现的,所以此时泛型应运而生.
1.泛型的基本使用
( 守门员),编译期检查类型是否正确
所谓的泛型指就是在类定义时不会设置类中的属性或方法参数的具体类型,而是在类使用时(创建对象时)再进行类型的定义.
public class MyClass<T>{
T value1;
T value2;
}
类声明后< >中这个T被称为类型参数,用于指代任意类型,实际上T只是代表,写啥都行
表示此事value1,value2都是在定义时没有明确类型,只有在使用时才告知贬义词类型.
处于规范而言,类型参数用单个的大写字母来代替,常见如下:
T:代表任意类
E:表示Element的意思,或是异常
K:与V搭配使用.Map<Integer,String>
V:
public class MyClass<T>{
T value1;
T value2;
public static void main(String[] args){
//创建这个泛型类的时候明确类型微整形
MyClass<Integer> myClass = new MyClass<>();
myClass.value1 = 10;
// myClass.value2 = "123";此时报错语句,因为创建对象时,声明为Integer型
}
}
如果要定义多种类型
public class MyClass<T, E> {
T value1;
E value2;
public static void main(String[] args) {
//创建多个类型
MyClass<Integer, String> myClass1 = new MyClass<>();
myClass1.value1 = 20;
myClass1.value2 = "213"; //此时编译正确
}
}
我们使用泛型改造Point时会发现,当创建Point对象时设置的类型和实际存储类型不同时,编译就会报错,程序无法启动,提前将问题暴露
泛型不光编译期就会校验类型以外,使用泛型不需要强制类型转换
public class Point<T> {
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;
}
public static void main(String[] args) {
//假设此时都是字符串
Point<String> point = new Point<>();
point.setX("北纬32");
point.setY("东经32");
//如果此时不小心输入错误,会有编译错误,而不是在运行时再出错
//无需强制类型转换
String x = point.getX();
String y = point.getY();
}
}
2.泛型方法
此处泛型方法指的是有自己的类型参数
下边代码中表示此方法是个泛型方法,有一个类型参数<T>不是返回值,只是告知编译器这是一个泛型的声明
void值没有返回值
public class Point<T> {
private T x;
private T y;
//泛型方法
public <T> void test(T t){
System.out.println(t);
}
}
泛型方法始终以自己的类型参数为准,和类中的类型参数无关(为了避免混淆,一般定义泛型方法时,尽量避免使用类中 使用过的类型参数字母)
完整的泛型方法
<S>表示fun方法是个泛型方法,有一个类型参数S
中间的S表示fun方法的返回值
括号中的S表示方法的形参是S类型
//完整的泛型方法
public <S> S fun(S t){
System.out.println(t);
return t;
}
3.泛型接口
//表示该接口是一个泛型接口
public interface INews<T> {
//返回值
T get(T t);
}
子类实现此接口时有两种选择,要么继续保留泛型,要么定义子类时明确类型
保留泛型的方式
public class NewsImpl<T> implements INews<T>{
@Override
public T get(T t) {
return null;
}
}
明确类型的方式
public class NewsImpl2 implements INews<String>{
@Override
public String get(String s) {
return null;
}
}