extends与super通配符的差别
副问题[/!--empirenews.page--]
在界说泛型范例Generic的时辰,也可以行使extends通配符来限制T的范例: public class Generic<T extends Number> { ... } 此刻,我们只能界说: Generic<Number> p1 = null; Generic<Integer> p2 = new Generic<>(1, 2); Generic<Double> p3 = null; 由于Number、Integer和Double都切合。 非Number范例将无法通过编译: Generic<String> p1 = null; // compile error! Generic<Object> p2 = null; // compile error! 由于String、Object都不切合,由于它们不是Number范例或Number的子类。 我们看一个例子: public class Test {
static class Food {
}
static class Fruit extends Food { }
static class Apple extends Fruit { }
static class Orange extends Fruit { }
public void testExtend() { List<? extends Fruit> list = new ArrayList<Apple>();
//无法安详添加任何具有现实意义的元素,报错,extends为上界通配符,只能取值,不能放. //由于Fruit的子类不但有Apple尚有Orange,这里不能确定详细的泛型到底是Apple照旧Orange,以是放入任何一种范例城市报错
//list.add(new Apple()); //list.add(new Orange());
//可以添加null,由于null可以暗示任何范例 list.add(null);
//可以正常获取,用java多态 Food foot = list.get(0); Apple apple = (Apple) list.get(0); }
public void testSuper() { List<? super Fruit> list = new ArrayList<Fruit>();
//super为下界通配符,可以存放元素,可是也只能存放当前类可能子类的实例,以当前的例子来讲, list.add(new Fruit()); list.add(new Apple());
//无法确定Fruit的父类是否只有Food一个(Object是超等父类) //因此放入Food的实例编译不通过,只能放本身的实例 可能按照java多态的特征放子类实例 //list.add(new Food()); //List<? super Fruit> list2 = new ArrayList<Apple>(); //Fruit fruit = list.get(0); //不能确定返回范例
}
} (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |