泛型的一个重要的作用就是类型的限定。如下代码将其arr1的类型限定为String不可以向集合添加其他类型的元素,arr2没有进行限定可以是任意类型,即Object代码如下所示。
package com.lari.demo;
import java.util.ArrayList;
public class Test {
public static void main(String[] args){
ArrayList<String> arr1 = new ArrayList();
arr1.add("hello");
// arr1.add(1);
ArrayList arr2 = new ArrayList();
arr2.add("hello");
arr2.add(1);
}
}
泛型类
如下,为其泛型类GenericType的定义与使用,对于不定义的实例g1,也相当与没有进行限定t可以设置任意类型为,而g2的t只可以设定为String类型。
package com.lari.demo;
//泛型类
public class GenericType <T>{
T t;
public void setT(T t) {
this.t = t;
}
public void showT() {
System.out.println(t);
}
}
// 测试
package com.lari.demo;
import java.util.ArrayList;
public class Test {
public static void main(String[] args){
GenericType g1 = new GenericType();
g1.setT(1);
GenericType<String> g2 = new GenericType();
g2.setT("hahhah");
}
}
泛型接口
// 泛型接口
public interface GenericInter <T> {
public void show(T t);
}
// 实现1(明确泛型的情况)
public class GenericImp1 implements GenericInter<String>{
@Override
public void show(String s) {
System.out.println(s);
}
}
// 实现2(不明确泛型的情况)
// 注意GenericInter后带<T>,否则实现的时候方法就变为public void show(Object o){}
public class GenericImp2<T> implements GenericInter<T> {
@Override
public void show(T t) {
}
}
泛型方法
返回值类型在返回值类型前面,这样就可以在参数里面使用泛型了
package com.lari.demo;
import java.util.ArrayList;
public class Test {
public static void main(String[] args){
show("hahhah");
}
public static <T, E> void show(T t){
System.out.println(t);
}
}
通配符与协变
数组可以协变但是集合不可以。所以在这里使用通配符
此处代码等有时间再补充上吧,该睡觉觉啦!