泛型 -Java

java

一、集合中的泛型

不使用泛型带来的问题:

ArrayList 默认接受Object类型的对象,所以所有对象都可以放进ArrayList中;

接着,需要进行强制转换才可以得到English类型或者Math类型;

如果程序员记忆比较好,能记得哪个是哪个,还是可以的;

但是,比如第10行,把第1个对象转换为English,这样就会出现类型转换异常 。

public class TestGeneric {

public static void main(String[] args) {

List schoolWork = new ArrayList();

schoolWork.add(new English());

schoolWork.add(new Math());

English eng = (English) schoolWork.get(0);

English eng1 = (English) schoolWork.get(1); //1对应Math,会出现异常

}

}

使用泛型

泛型的用法是在容器后面添加

Type可以是类,抽象类,接口。

public class TestGeneric {

public static void main(String[] args) {

List<English> schoolWork = new ArrayList<>();

schoolWork.add(new English());

// schoolWork.add(new Math()); 其他类型放不进去

}

}

子类对象

如上代码,如果Math是English的子类,那么English泛型的容器是可以放进去Math类对象的。

二、通配符

?extends

//假设Math和English是Chinese的子类

List<?extends Chinese> schoolWork = new ArrayList<>();//表示这是一个Chinese泛型或其子类泛型

//schoolWork 的泛型有可能是Chinese、Math或者是English

//也就是说取出来一定可以转成Chinese类,但却不可以放进去对象

?super

//假设Math和English是Chinese的子类,Chinese是Object的子类

List<?super Chinese> schoolWork = new ArrayList<>(); //表示这是一个Chinese泛型或其父类泛型

//schoolWork 的泛型可能是Chinese或者是其父类Object

//也就是说可以放进去Chinese类对象或者Math和English类对象,但却无法取出,因为Object强转Chinese是会失败的

?

List<?> schoolWork = new ArrayList<>();  //表示这是一个任意类泛型

//也就是说只能以继承树顶类型取出对象,却无法放进去对象

总结

如果希望只取出,不插入,就使用? extends

如果希望只插入,不取出,就使用? super

如果希望,又能插入,又能取出,就不要用通配符?

相关ArrayList知识请点击这里

以上是 泛型 -Java 的全部内容, 来源链接: utcz.com/z/392381.html

回到顶部