对于目前Java还是自学的我在昨天晚上遇到了些许问题,如下:
public class GenericTest {
public static void main(String[] args) {
List<?> list=new ArrayList<>();
}
}
起初遇到这个代码的时候,我使用add添加元素,但是发现添加不了,后来我就想,既然添加不了,这个代码还有什么意义呢
后来我看了一下List接口,发现:
List需要提供的一个类型,而 " ? " 是一个未知的类型
那怎么用呢,看下面这段代码:
import java.util.List;
public class Generic {
public void show(List<?> element){
for (Object o : element) {
System.out.println(o);
}
}
}
public class GenericTest {
public static void main(String[] args) {
Generic gen=new Generic();
List<Integer> list=new ArrayList<>();
list.add(123);
list.add(123);
gen.show(b);
}
}
怎么看这段代码呢?如果说我将泛型类中的List<?>改成了List<String>之后,那如果我们在泛型测试类中添加一个String之后,就报错了,为什么呢?因为我们指定的是一个String类型,我们添加的元素是一个Integer类型的,那如果是 " ? "呢,就成了一个未知类型,这样我们添加什么类型就是什么类型了,但是如果添加了String类型之后就不能添加Integer类型了。
在 " ? "类型中呢,还有两个界限,叫做上限和下限,也称为上界和下界:
//上限格式:
List<? extends Number> list=new ArrayList<>();
//下限格式:
List<? super Number> list=new ArrayList<>();
我们再来看一段代码:
import java.util.List;
public class Generic {
public void show(List<? extends Number> element){
for (Object o : element) {
System.out.println(o);
}
}
}
public class GenericTest {
public static void main(String[] args) {
Generic gen=new Generic();
List<Integer> list=new ArrayList<>();
list.add(123);
list.add(123);
gen.show(b);
}
}
我们发下和上面的例子比起来,多了一个extends Number,怎么理解呢,向这样写,那么我添加的元素只能是Number类型的子类元素,而不能是别的元素其父类元素
那么我们看一下下界例子:
import java.util.List;
public class Generic {
public void show(List<? super Number> element){
for (Object o : element) {
System.out.println(o);
}
}
}
public class GenericTest {
public static void main(String[] args) {
Generic gen=new Generic();
List<Integer> list=new ArrayList<>();
list.add(123);
list.add(123);
gen.show(b);
}
}
这里我们讲extends改成了super,运行这段代码的时候,我们发现报错了,因为需要的元素是Number其父类及集成其父类的元素,所以我们添加Integer类型的元素时,是不可以的
昨天晚上就搞这些东西了,如果你们也遇到了这类的疑惑就看一看吧。