java# 泛型
使用集合的时候经常会遇到一些问题,王几何中村元素,可以存任何引用类型,但取出来全是object(自动向上转型),现在要使用类型当中特有的方法.转回来,没有把饭约束集合当中只能存某一种数据类型
什么事泛型?广泛通用的类型,代码模板中类型不确定,谁调用该段代码谁就可以来指明这个类型
package com.company;
//一半习惯写作T或者E代表Element和Key
class Point<T>{
//可以是任何类型
T x;
T y;
}
public class Main {
public static void main(String[] args) {
//定义的时候分俩步
//在变量的前面添加上一个
// Point p=new Point();//创建对象的时候指明类型,没有指明就是object
Point<String>p=new Point<>();
p.x="10";
p.y="20";
}
}
注意点
泛型前后类型必须保持一致
从Java7开始,后面的类型可以不写
错误的写法:Point<Object>p=new Point<String>();
就算是父类也不行
这样的写法是个语法糖,编译成字节码,泛型的本质还是Object类型.内部还是要做强转的!因此可以用反射直接拿字节码.绕过类型的检测.
应用
泛型类:在类上面定义的泛型,在创建对象的时候,要指明泛型的类型.泛型当中定义的泛型只能用在普通方法上面,不能使用在静态方法上面,静态方法是直接使用类名调用,而泛型是创建对象的时候才指定的.
泛型方法:就是在方法上面添加了泛型
package com.company;
//一半习惯写作T或者E代表Element和Key
class Test<T>{//泛型类
//可以是任何类型
T name;
public T getName(){//泛型方法
return name;
}
//自定义泛型
public<T> void test(T a){
}
//静态方法也可以定义泛型
static <E> void test2(){
}
}
public class Main {
public static void main(String[] args) {
//定义的时候分俩步
//在变量的前面添加上一个
//Point p=new Point();//创建对象的时候指明类型,没有指明就是object
Test<String>p=new Test<String>();
new Test().test("a");//传入的是什么类型,泛型t就是什么类型.
Test.test2(true);
}
}
通配符
不知道使用什么类型参数来接收的时候
package com.company;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List <Integer> list=new ArrayList<>();
test(list);
List <String> list2=new ArrayList<>();
test(list2);
}
//?是个通配符,不知道接收什么类型的时候开业用?表示位置,通配符只能用来做接收使用,不能做添加操作
static void test(List<?>list){
}
}
通配符的上下线
package com.company;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List <Integer> list=new ArrayList<>();
test(list);
List <Double> list2=new ArrayList<>();
test(list2);
List <Number> list3=new ArrayList<>();
test2(list3);
}
//?是个通配符,不知道接收什么类型的时候开业用?表示位置,通配符只能用来做接收使用,不能做添加操作
//泛型的上限:用来限定元素的类型必须得是制定类型或其的子类
static void test(List<? extends Number>list){
}
//泛型的下限 用来限定元素的类型必须是指定类型或其的父类
static void test2(List<? super Number>list){
}
}
泛型擦除
package com.company;
import java.util.ArrayList;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String>list=new ArrayList<>();
list.add("aa");
List list2=null;
list2=list;//把list当中的泛型擦除掉
list2.add(10);
list2.add("aa");
}
}