首页 > 试题广场 >

Which three statements are tru

[不定项选择题]
class A {}
class B extends A {}
class C extends A {}
class D extends B {}
下面的哪4个语句是正确的?
  • The type List<A>is assignable to List.
  • The type List<B>is assignable to List<A>.
  • The type List<Object>is assignable to List<?>.
  • The type List<D>is assignable to List<?extends B>.
  • The type List<?extends A>is assignable to List<A>.
  • The type List<Object>is assignable to any List reference.
  • The type List<?extends B>is assignable to List<?extends A>.
耐心看完,保证能懂这道题!
1. 只看尖括号里边的!!明确点和范围两个概念
2. 如果尖括号里的是一个类,那么尖括号里的就是一个点,比如List<A>,List<B>,List<Object>
3. 如果尖括号里面带有问号,那么代表一个范围,<? extends A> 代表小于等于A的范围,<? super A>代表大于等于A的范围,<?>代表全部范围
4. 尖括号里的所有点之间互相赋值都是错,除非是俩相同的点
5. 尖括号小范围赋值给大范围,对,大范围赋值给小范围,错。如果某点包含在某个范围里,那么可以赋值,否则,不能赋值
6. List<?>和List 是相等的,都代表最大范围
----------------------------------------------------------------------------------
7.补充:List既是点也是范围,当表示范围时,表示最大范围

下面贴代码:(本来用的Eclipse截图的,结果好像网站出来Bug,不能传图了o(╯□╰)o)
public static void main(String[] args) {
		List<A> a;
		List list;
		list = a;   //A对,因为List就是List<?>,代表最大的范围,A只是其中的一个点,肯定被包含在内
		List<B> b;
		a = b;      //B错,点之间不能相互赋值
		List<?> qm;
		List<Object> o;
		qm = o;     //C对,List<?>代表最大的范围,List<Object>只是一个点,肯定被包含在内
		List<D> d;
		List<? extends B> downB;
		downB = d;  //D对,List<? extends B>代表小于等于B的范围,List<D>是一个点,在其中
		List<?extends A> downA;
		a = downA;  //E错,范围不能赋值给点
		a = o;      //F错,List<Object>只是一个点
		downA = downB;  //G对,小于等于A的范围包含小于等于B的范围,因为B本来就比A小,B时A的子类嘛
	}

编辑于 2016-07-30 12:24:04 回复(177)
public <T> int delete(Class<T> entityClass , List<? extends Serializable> ids);
分析一下上面这个:
1.<?代表传过来的类型,extends表示传过来的必须是Serializable的子类>那么里面装的必须是实现了Serializable的子类。这是代表向下转型。
2.向上转型是<? super xxx>

发表于 2015-08-16 13:53:53 回复(0)
f g
发表于 2015-01-21 21:46:12 回复(0)
这是某点属于某范围的问题,不是父子代的问题
发表于 2019-03-05 08:02:16 回复(0)
我是在《数据结构与算法分析java版》这本书看到的。网上相关博客也有很多。我也不知道能不能用来解释这个题目。
大概的观点就是:java数组具有协变性,而java集合不是协变的;
什么意思呢?我举几个例子:
1. 假设有一个函数 fun(Animal animal),如果我们传入一个Dog d 对象进去,编译器是不会报错的,这是多态的概念;
2. 假设有一个函数 fun(Animal[] animals),如果我们传如一个Dog[] dogs数组进去,编译器也不会报错,这就是数组的协变性;
3. 假设有一个函数 fun(List<Animal>  animal), 如果我们传如一个List <Dog>  dog 集合进去,编译器就会报错了,这就是集合泛型的不变性;
那么该怎么办呢?我们可以将泛型改成这样 fun (List <? extends Animal> ),这样之后,当我们再 传入一个List <Dog>  dog 集合进去,编译器就就不会报错了。也就是说可以传入包含Animal的子类的List了。
发表于 2016-08-30 14:17:01 回复(14)
泛型只是在 编译期 保证对象类型相同的技术。
真正在代码的运行期,jvm会擦出泛型的存在。
所以我们可以利用反射技术为一个已指定泛型的集合添加一个不符合泛型要求的元素,因为反射的生效期在运行期,泛型无法进行拦截。
因此,泛型指定的元素不具有继承的特性。不能将泛型中的派生类类型复制给基类类型。
因此BEF错误。
从而出现了通配符的技术,为了解决在泛型中不能像正常JAVA类中的继承关系。
我个人的理解是通配符的继承就是为了弥补泛型在继承关系上面的缺陷而诞生的。
因此集合可以使用通配符来描述继承关系,但不能直接使用指定泛型来描述。
通配符的方式可以正确的描述带泛型集合的继承关系。
因此CDG正确
以上为个人理解,如有不足,请大家不吝赐教。

编辑于 2016-01-24 14:58:42 回复(9)

泛型只是在编译期保证对象类型相同的技术,jvm会把代码编译成泛型的正确类型。并不存在继承的关系。所以使用通配符来弥补这种不足,用通配符来描述继承关系<br>
通配符有三种表示形式:<br>
List和List<?>是一样的,表示的是任意类型,就是Object类<br>
List<?extends B>表示上边界限定通配符,就是B以及B的子类,可以理解为小于等于B的这样一个List范围<br>
List<?super B>表示下边界限定通配符,就是B以及B的父类,可以理解为大于等于B的这样一个List范围<br>
<br>
题中的is assignable to 是归属于的意思,在java中既是继承的关系,A is assignable to B 就像是A是B的子类(类似),A归属于B。<br>
A选项:List<A> 是List的子类,正确<br>
B选项:List<B>和List<A>是两个不相干的类型,所以List<B>不归属与List<A>,错误<br>
C选项:List<Object>和List<?>乐意理解为一样,所以正确<br>
D选项:List<D>在List<? extends B>的范围内(或者List<D>是List<? extends B>的子类,好理解)正确<br>
E选项:List<? extends A>是一个范围,不能归属与List<A>,可以这样理解,List<A>太小,不能包含他自身和子类范围,所以错误<br>
F选项:List<Object>归属于任何相关的List,我想正确的应该是任何相关的类归属与List<Object>,所以错误<br>
G选项:同E选项,List<? extends B> 这个范围归属于List<? extends A> ,所以正确<br>
发表于 2016-08-22 22:36:37 回复(3)
ACDG 考察泛型通配符
  ?:任意类型,如果没有明确,那么就是Object以及任意的Java类了
  ? extends E:向下限定,E及其子类
  ? super E:向上限定,E及其父类

发表于 2015-08-17 16:49:22 回复(2)
A,C,D,G对,本人亲测
  • The type List<A>is assignable to List.
意思是List<A>类型的变量可以赋给类型为List类型的变量
本人用的JDK是1.7.0_60,IDE是IntelliJ IDEA 14.1.4
public class TestDemo {  public void test() {
        List list = new ArrayList();
        List<A> listA = new ArrayList<>();
        list = listA; // A  List<B> listB = new ArrayList<>(); //        listA = listB; // B错误   List<Object> listObject = new ArrayList<>();
        List<?> list$ = new ArrayList<>();
        list$ = listObject; // C  List<D> listD = new ArrayList<>();
        List<? extends B> listExtendsB = new ArrayList<>();
        listExtendsB = listD; // D  List<? extends A> listExtendsA = new ArrayList<>(); //        listA = listExtendsA; // E错误   // F明显错误   listExtendsA = listExtendsB; // G } class A {
    } class B extends A {
    } class C extends A {
    } class D extends B {
    }
}
编辑于 2015-08-11 10:34:03 回复(8)
成功避开所有正确选项
发表于 2016-05-11 10:07:46 回复(10)

进来就发现不认识assignable这个单词,一看选项就知道会很惨了,全是这个单词!

发表于 2018-08-09 16:38:20 回复(0)
类型列表A可分配给列表
类型列表B可分配给列表A
类型列表<Object>可分配给列表<?>(指泛型)
类型列表D可分配给列表<?继承B>
类型列表<?继承A>可分配给列表A
类型列表<Object>可分配给任何列表引用
类型列表<?继承B>可分配给列表<?继承A>
发表于 2019-01-16 23:23:57 回复(0)
1.list为原始类,可接受除了空以外的任何类型,可接受A类型
2.list<类>只能接受该类类型,子类不行
3.同1
4.List<?extends B>.可接受B的子类,D为B的子类
5.同2
6.List<?>才可以接受任何类型
7.List<?extends B>可接受B的子类,list<?extends A>可接受A的所有子类,B为A的子类,可以接受B
发表于 2018-04-11 15:25:49 回复(0)
谁能给我解释下F,多谢了
发表于 2015-08-27 20:17:55 回复(4)
发表于 2021-07-23 06:15:30 回复(0)
由于在编程过程中的顺序不可控性,导致在必要的时候必须要进行类型判断,且进行强制类型转换。显然,这与泛型的理念矛盾,因此, 在逻辑上Box<Number>不能视为Box<Integer>的父类。
number 为 Integer 的父类

因此,我们需要一个在逻辑上可以用来表示同时是Box<Integer>和Box<Number>的父类的一个引用类型,由此,类型通配符应运而生。

类型通配符一般是使用 ? 代替具体的类型实参。注意了,此处是类型实参,而不是类型形参!且Box<?>在逻辑上是Box<Integer>、Box<Number >...等所有Box<具体类型实参>的父类。由此,我们依然可以定义泛型方法,来完成此类需求。


编辑于 2015-11-12 20:48:14 回复(5)
可以看看这个
发表于 2020-12-22 20:41:07 回复(0)
我是个渣渣,连解析都看不进去😭
发表于 2020-03-28 11:39:00 回复(0)
F的意思是 List<Object>归属于任何具有参考的类,什么是具有参考的类呢?具有参考就是有别人的信息,所以List<Object>这个最大范围的怎么能属于 小范围的呢?
发表于 2018-04-03 00:52:35 回复(0)
耐心看完,保证能懂这道题!
1. 只看尖括号里边的!!明确点和范围两个概念
2. 如果尖括号里的是一个类,那么尖括号里的就是一个点,比如List<A>,List<B>,List<Object>
3. 如果尖括号里面带有问号,那么代表一个范围,<? extends A> 代表小于等于A的范围,<? super A>代表大于等于A的范围,<?>代表全部范围
4. 尖括号里的所有点之间互相赋值都是错,除非是俩相同的点
5. 尖括号小范围赋值给大范围,对,大范围赋值给小范围,错。如果某点包含在某个范围里,那么可以赋值,否则,不能赋值
6. List<?>和List 是相等的,都代表最大范围
----------------------------------------------------------------------------------
7.补充:List既是点也是范围,当表示范围时,表示最大范围

publicstaticvoidmain(String[] args) {
        List<A> a;
        List list;
        list = a;  //A对,因为List就是List<?>,代表最大的范围,A只是其中的一个点,肯定被包含在内
        List<B> b;
        a = b;     //B错,点之间不能相互赋值
        List<?> qm;
        List<Object> o;
        qm = o;    //C对,List<?>代表最大的范围,List<Object>只是一个点,肯定被包含在内
        List<D> d;
        List<?extendsB> downB;
        downB = d; //D对,List<? extends B>代表小于等于B的范围,List<D>是一个点,在其中
        List<?extendsA> downA;
        a = downA; //E错,范围不能赋值给点
        a = o;     //F错,List<Object>只是一个点
        downA = downB; //G对,小于等于A的范围包含小于等于B的范围,因为B本来就比A小,B时A的子类嘛
    }

发表于 2018-03-28 10:54:51 回复(0)