众所周知,java中可以使用泛型,在声明类的方法的时候可以不必指定类型,而是使用泛型代替,当作为泛型方法时,Java会根据你传入的类型,替换泛型为传入的类型,泛型类也差不多。
泛型方法:
public class Test {
public static <T> T getprint(T s) {return s;}
public static void main(String[] args) {
System.out.println(getprint("abc"));
System.out.println(getprint(123));
ArrayList<String> list=new ArrayList<>();
list.add("aaa");
list.add("bbb");
System.out.println(getprint(list));
}
}
泛型类:
public class Study {
public static void main(String[] args) {
Test<String> test01=new Test<String>("abc");
System.out.println(test01.getKey());
//
Test<Integer> test02=new Test<Integer>(123);
System.out.println(test02.getKey());
//
Test<ArrayList<String>> test03=new Test<ArrayList<String>>(new ArrayList<>(Arrays.asList("aaa", "bbb")));
System.out.println(test03.getKey());
}
}
class Test<T> {
private T key;
public Test(T key) {this.key = key;}
public T getKey() {return key;}
public void setKey(T key) {this.key = key;}
}
泛型z作用范围:
当类上声明泛型T同时方法也声明泛型T,方法的泛型和类泛型是隔离的即使是相同T。
public class Stdudy<T> {
/*
* 方法前无<T>,泛型类中的方法,其中的T类型与泛型类的T类型一致。
*/
public T gogo(T t) {return t;}
/*
* 方法前有<T>,泛型方法,其中的T类型是独立的,不受泛型类的T类型约束
*/
public <T> T go(T t) {
return t;
}
public static void main(String[] args) {
String s = "abc";
new Stdudy().go(s);
}
}
此外还有一种?符号,这里他不是三目运算符
其中?是什么呢,?是泛型通配符,而不是泛型
此外泛型还可以指定范围:
extends:表示类型上界。例:A extends B,表示类型必须是B或B的子类
super:表示类型下界。例:A super B,表示类型必须是B或B的父类
<? extends Number>表示初始化值上限值是小于等于Number,下限值是无穷小的子类 <? super Integer>表示初始化值上限值是小于等于Object,下限值是大于等于Integer <?>表示无限大List list=new ArrayList<>();
这个list在插入值时,这个例子中插入值必须小于等于Number,即必须是Number或者他的子类。
但是List<?> list=new ArrayList();无法添加
当你声明 List<?>
时,你声明了一个可以持有任何类型对象的列表。但是,由于类型擦除,你不能向这样的列表中添加任何对象,因为编译器无法确定添加的对象类型是否安全。你可以从中读取对象,但必须进行类型检查或转换。
“?”可以独立用于参数范围的限定:
public class Test {
public static void go(List<? extends Number> dest){
System.out.println(dest);
}
public static void main(String[] args) {
go(new ArrayList<>(Arrays.asList(111,222)));
}
}
“?”通配符也可以和泛型配合:
public static <T> void go(List<? extends T> dest){
System.out.println(dest);
}
也可以和泛型配合:
public static <T> void go(List<? extends T> dest){
System.out.println(dest);
}