(1)泛型类型
下例代码中a是一个泛型的List集合,声名List<String>将告诉编译器这个List的实例(对象)只能存储String的对象。不过要注意的是泛类类型的类型检查是在编译时进行的。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Easy {
public static void main(String[] args) {
List<String> a = new ArrayList<>();//指定传入的对象元素
a.add("212");
String b = a.get(0);//不用进行类型转换,因为get()方法会返回预期类型即指定传入类型
System.out.println(b.toUpperCase());//212
}
}
2.扩展List<List<String>> -泛类也是类型所以可以指定
public static void main(String[] args) {
List<String> a= new ArrayList<>();//指定传入的对象元素
a.add("212");
List<List<String>> b = new ArrayList<>();//因为泛类也是类型所以可以指定
b.add(a);
System.out.println(b.get(0));//[212]
System.out.println(b.get(0).get(0));//第一次返回的是集合a,第二次返回的是a的元素
//212
}
3.Map泛类- Map集合中键和值的元素可以分别定义
public static void main(String[] args) {
Map<String,Dog> map = new HashMap<>();//Map集合中键和值的元素可以分别定义
Dog dog1 = new Dog(2);
map.put("Hello", dog1);
System.out.println(map.get("Hello"));
}
(2)"?"通配符
下例代码会产生错误,虽然String是Object的子类,但是对于泛类来说它们之间没有任何关系所以对myList使用get()功能会产生错误
public class Easy {
public static void get(List<Object> a) {//该功能需要一个Object类型的集合
}
public static void main(String[] args) {
List<String> myList = new ArrayList<>();
get(myList);//这会产生错误
}
}
解决方法
使用通配符改写get()功能
public class Easy {
public static void get(List<?> a) {//使用通配符可以使该功能接收任何类型的集合
}
public static void main(String[] args) {
List<String> myList = new ArrayList<>();
get(myList);
}
}
2.有界通配符
使用有界通配符可以使功能接收对应类型的子类
1.上界 -extends
public class Easy {
public static void get(List<? extends Number> a) {//使用有界通配符可以使功能接收对应类
//型的子类
}
public static void main(String[] args) {
List<Integer> myList = new ArrayList<>();
get(myList);
}
}
2.下界 -super
public class Easy {
public static void get(List<? super Integer> a) {//使用有界通配符可以使功能接收对应类
//型的超类(父类)
}
public static void main(String[] args) {
List<Integer> myList = new ArrayList<>();
get(myList);
}
}
扩展
抽象类Number是表示可转换为字节、双精度、浮点、int、long和short等基本类型的数值的包装类的超类
3.泛类的类型
实例化的泛类类型时必须指定参数类型,而泛类方法的参数类型是由该对象方法调用和相应的声名中推断出来的。
class Dog<T>{
T x;
T y;
public Dog(T x,T y){
this.x=x;
this.y=y;
}
}
public class Easy {
public static void main(String[] args) {
Dog<Integer> dog = new Dog<>(1,2);//dog对象接收的Dog构造方法只接收Integer类的数据
Dog<Double> dog2 = new Dog<>(1.2,2.5);//同理 注意 括号内的数据都完成了装箱的操作
}
}