<? extends T>
extends关键字是上限,?类型是E或者E的子类型
可以读取E,但不能写入,因为不知道声明对象是符合未知的E的子类型
<? super T>
package com.lyl.jni.kt;
import java.util.ArrayList;
/**
* Create By: lyl
* Date: 2020/5/9 2:49 PM
*/
public class genericityTest {
public static void main(String[] args) {
}
public void test1() {
//上限
ArrayList<? extends Object> list = new ArrayList<>();
//不能加
// why ?extends Object 表示?继承至Object,?是子类,Object是父类 表明 list 里面的数据是 Object 和 Object 的子类
// 当要向 list 添加一个数据时,list(java vm) 不知道要添加数据的类型是 Object 还是 Object 的子类,不知道是不是符合未知的Object的子类型,所以拒绝添加
// 从 list 里面的到一个数据,list 的数据类型是 Object 和 Object 的子类,所以可以将取出的数据向上转型成 Object 类型
// list.add("aa");
Object o = list.get(0);
}
// List<? extends E> a
// extends关键字是上限,?类型是E或者E的子类型
// 可以读取E,但不能写入,因为不知道声明对象是符合未知的E的子类型
public void test2() {
ArrayList<? super Object> list = new ArrayList<>();
list.add("aa");
// Object o = null;
// list.add(o);
Object s = list.get(0);
}
public void test3() {
//上限
ArrayList<? extends H3> list = new ArrayList<>();
//不能加
// why ?extends Object 表示?继承至Object,?是子类,Object是父类 表明 list 里面的数据是 Object 和 Object 的子类
// 当要向 list 添加一个数据时,list(java vm) 不知道要添加数据的类型是 Object 还是 Object 的子类,不知道是不是符合未知的Object的子类型,所以拒绝添加
// 从 list 里面的到一个数据,list 的数据类型是 Object 和 Object 的子类,所以可以将取出的数据向上转型成 Object 类型
H1 h1 = new H1() {
};
H2 h2 = new H2();
H3 h3 = new H3();
H4 h4 = new H4();
H5 h5 = new H5();
// list.add(h1);
// list.add(h2);
// list.add(h3);
// list.add(h4);
// list.add(h5);
H3 h31 = list.get(0);
//------------------------------------------------------------------------------------------
ArrayList<? extends H2> listP = new ArrayList<>();
ArrayList<? extends H4> listC = new ArrayList<>();
//out
// list is H3
// listP request H2 , H3 extends H2 , H3 可以向上转型成 H2 ?,可以转型吗 java 里面可以,(里氏替换)
// listC 需要H4 ,H4 extends H3, H3 需要向下转型成 H4 ?,行吗 需要强转 一般不行
listP = list;
listC = (ArrayList<? extends H4>) list;
// listC = list;
}
public void test4() {
//下限
ArrayList<? super H3> list = new ArrayList<>();
//不能加 H1 H2
//可以加 H4 H5
// why ?extends Object 表示?继承至Object,?是子类,Object是父类 表明 list 里面的数据是 Object 和 Object 的子类
// 当要向 list 添加一个数据时,list(java vm) 不知道要添加数据的类型是 Object 还是 Object 的子类,不知道是不是符合未知的Object的子类型,所以拒绝添加
// 从 list 里面的到一个数据,list 的数据类型是 Object 和 Object 的子类,所以可以将取出的数据向上转型成 Object 类型
H1 h1 = new H1() {
};
H2 h2 = new H2();
H3 h3 = new H3();
H4 h4 = new H4();
H5 h5 = new H5();
// list.add(h1);
// list.add(h2);
list.add(h3);
list.add(h4);
list.add(h5);
Object object = list.get(0);
//------------------------------------------------------------------------------------------
ArrayList<? super H2> listP = new ArrayList<>();
ArrayList<? super H4> listC = new ArrayList<>();
//out
// list is H3
// listP request H2及父类 , H3 extends H2 , H3 可以向上转型成 H2 ?,可以转型吗 java 里面可以,(里氏替换)
// listC 需要H4及父类 ,H4 extends H3, H3 是 H4 的父类
// listP = list;
listP = (ArrayList<? super H2>) list;
listP = (ArrayList<? super H1>) list;
listP = (ArrayList<? super Object>) list;
listC = list;
}
abstract class H1 {
}
class H2 extends H1 {
}
class H3 extends H2 {
}
class H4 extends H3 {
}
class H5 extends H4 {
}
}