泛型
相当于将数据类型参数化
泛型只作用于编译期,在编译后会被所指定的具体类型代替
//定义一个泛型类
public class Node<T> {
private T data;//泛型,参数化数据类型
public Node() {}
public Node(T data) {
this.data = data;
}
public T getData() {
return data;
}
public T setData() {
return data;
}
}
public class GenericDemo {
public static void main(String[] args) {
testNode();
}
private static void testNode() {
Node<String> strNode = new Node<String>("一二三四五六七八九十");
Node<Number> numNode = new Node<Number>(10);
Node<Integer> intNode = new Node<Integer>(10);
System.out.println(strNode.getData());
System.out.println(numNode.getData());
System.out.println(intNode.getData());
}
}
同一个泛型类但不同数据类型,两者之间无法进行转换,此时可以使用通配符处理?
表示可以接收任意的泛型类型,但是只能接收输出,不能修改和赋值
public void test() {
Node<Number> n1 = new Node<Number>(10);
Node<Integer> n2 = new Node<Integer>(20);
getData(n1);
// getData(n2);//报错
}
public static void getData(Node<Number> node) {
System.out.println(node.getData());
}
//通配符
public static void getData2(Node<?> node) {
// node.setData(123);//用来赋值会报错
System.out.println(node.getData());//只能用于读取
}
//泛型上限,表示所能接收类型只能是指定类或其子类(使用关键字extends)
//泛型下线,表示所能接收类型只能是指定类或其父类(使用关键字super)
public static void getData3(Node<? extends Number> node){
System.out.println(node.getData());
}
泛型还可以定义在方法中
public static void test2() {
String[] arrays = {"blink","lubricate","bottle"};
String[] s = func(arrays,0,2);
System.out.println(Arrays.toString(s));
}
//泛型方法
public static <T> T[] func(T[] array,int i,int j){
T temp = array[i];
array[i] = array[j];
array[j] = temp;
return array;
}
泛型的嵌套使用:
//嵌套
public static void test3() {
Map<Integer,String> map = new HashMap<Integer, String>();
map.put(1, "coco");
map.put(2, "csocso");
Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
for(Map.Entry<Integer, String> entry:entrySet) {
System.out.println(entry.getKey()+"-"+entry.getValue());
}
}