`

关于Java 泛型 ?extends T 的问题

 
阅读更多

http://topic.csdn.net/u/20120516/22/a19617f5-943e-494c-9595-1c049b1cc3ef.html?seed=208934876&r=78626688#r_78626688

问:

在学习java泛型时 ,看到了泛型的一个例子

List<Apple> apples = new ArrayList<Apple>();
List<? extends Fruit> fruits = apples;
fruits.add(new Strawberry());

其中,Fruit是父类、Apple和Strawberry是子类,add操作执行错误,给出的解释是

“这个? extends T 通配符告诉编译器我们在处理一个类型T的子类型,但我们不知道这个子类型究竟是什么。因为没法确定,为了保证类型安全,我们就不允许往里面加入任何这种类型的数据。”

我不明白编译器怎么会不知道这个子类型是什么呢?如果不知道的话,语句List<? extends Fruit> fruits = apples;为什么不报错呢?

 

答:

我觉得现在剩下来的一个主要问题就是为什么在加元素时以子类型不确定的理由而编译错误(这个可以理解,? extends Fruit就表示某一种unknown type,范围是包括Fruit及其子类),在apples赋给fruits时就没有以同样的理由报错,我想是设计上的原因,类型范围意义上它们是可以这 样排列的:
List<? extends Fruit>

super than

List<Apple>

super than

ArrayList<Apple>

方向是祖先类=>子孙类

但是在涉及容器是否可添加元素判断时,因编译时容器元素类型只是根据? extends Fruit来确定,因此会报不确定子类型,比如即使改成这样也会编译报错:
List<Apple> apples = new ArrayList<Apple>();
List<? extends Fruit> fruits = apples;
fruits.add(new Apple()); //compile error

这个10楼说过了

但我们知道实际上这个List要装的就是Apple,但在编译时就不知道。

http://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html

分享到:
评论

相关推荐

    泛型中? super T和? extends T的区别

    经常发现有List&lt;? super T&gt;、Set&lt;? extends T&gt;的声明,是什么意思呢?&lt;? super T&gt;表示包括T在内的任何T的父类,&lt;? extends T&gt;表示包括T在内的任何T的子类,下面我们详细分析一下两种通配符具体的区别。

    Java泛型中? super T和? extends T的区别

    extends T&gt;表示包括T在内的任何T的子类,下面我们详细分析一下两种通配符具体的区别。  extends  List&lt;? extends Number&gt; foo3的通配符声明,意味着以下的赋值是合法的:  // Number "extends" Number (in...

    Java泛型的用法及T.class的获取过程解析

    Java泛型的用法及T.class的获取过程解析 Java泛型是Java编程语言中的一种重要特性,它允许开发者在编写代码时指定类型参数,从而提高代码的灵活性和可读性。本文将详细介绍Java泛型的用法 及T.class的获取过程解析...

    Java泛型编程指南.pdf

    ### Java泛型编程指南知识点详解 #### 一、绪论:理解Java泛型的重要性与背景 **1.1 泛型的基本概念** 泛型是一种在编程语言中支持编写类型安全的通用函数或类的能力。在Java中引入泛型的主要目的是为了提供更...

    java泛型总结

    ### Java泛型总结 #### 一、Java泛型概述 Java泛型是在JDK5之后引入的一个特性,它提供了一种类型安全的机制,用于指定集合或其他数据结构中的元素类型。通过使用泛型,程序员可以在编译阶段检测类型错误,避免了...

    Java中List<? extends T>与List<? super T>的区别(值得珍藏)

    Java中的泛型是编程中非常重要的一个特性,它允许我们以一种类型安全的方式处理集合,减少类型转换的麻烦。在Java中,List&lt;T&gt;、List&lt;? extends T&gt;和List&lt;? super T&gt;是泛型的不同使用形式,它们在类型约束和操作上...

    关于java基础的泛型的练习

    Java泛型是Java SE 5.0引入的一个重要特性,它极大地增强了代码的类型安全性和可读性。泛型在编程中的应用广泛,特别是在集合框架中,使得我们可以在编译时就检查类型,避免了不必要的类型转换,并且提高了代码的...

    Java泛型三篇文章,让你彻底理解泛型(super ,extend等区别)

    在 Java 泛型中,extends 和 super 是两个重要的关键字,它们分别用于限定类型的上界和下界。 extends 用于限定类型的上界,表示参数化类型可能是 T 或 T 的子类。例如: List&lt;? extends Fruit&gt; flist = new ...

    Java泛型extends及super区别实例解析

    Java泛型extends及super区别实例解析 Java泛型中的通配符(Wildcards)和边界(Bounds)是两个重要的概念,分别由 &lt;? extends T&gt; 和 &lt;? super T&gt; представляют。这些概念的出现是为了解决泛型中的一些...

    SUN公司Java泛型编程文档

    Java泛型是Java编程语言中的一个关键特性,它在2004年随着JDK 5.0的发布被引入。这个特性极大地提高了代码的类型安全性和可读性,减少了在运行时出现ClassCastException的可能性。SUN公司的Java泛型编程文档,包括...

    Java泛型应用实例

    Java泛型是Java编程语言中的一个强大特性,它允许我们在定义类、接口和方法时指定类型参数,从而实现代码的重用和类型安全。在Java泛型应用实例中,我们可以看到泛型如何帮助我们提高代码的灵活性和效率,减少运行时...

    java泛型技术之发展

    Java泛型技术是Java编程语言中的一个重要特性,它在2004年随着Java SE 5.0的发布而引入,极大地增强了代码的类型安全性和可读性。本篇文章将深入探讨Java泛型的发展历程、核心概念以及其在实际开发中的应用。 一、...

    java泛型的内部原理及更深应用

    Java泛型是Java编程语言中的一个强大特性,它允许在定义类、接口和方法时使用类型参数,从而实现参数化类型。这使得代码更加安全、可读性更强,并且能够减少类型转换的必要。在“java泛型的内部原理及更深应用”这个...

    Java泛型技术之发展.pdf

    Java泛型的引入是为了解决早期版本中类型转换频繁和潜在的ClassCastException问题。在Java泛型出现之前,集合框架(如ArrayList、HashMap等)都是基于Object设计的,这导致了在存储和取出对象时需要进行强制类型...

    java 泛型接口示例

    下面我们将详细探讨Java泛型接口的相关知识点。 1. **泛型接口的定义** 泛型接口的定义方式与普通接口类似,只是在接口名之后添加了尖括号`&lt;T&gt;`,其中`T`是一个类型参数,代表某种未知的数据类型。例如: ```java...

    面试必须资料java泛型攻略、

    #### 一、什么是Java泛型? Java泛型(Generics)是一种在编译时确保类型安全的机制,它允许程序员编写类型安全的通用类或方法,而无需进行显式的类型转换。在Java 1.5引入泛型之前,集合类(如`ArrayList`)只能...

    详谈Java泛型中T和问号(通配符)的区别

    Java泛型中T和问号(通配符)的区别 Java泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、...

    Java泛型总结(2)进阶篇

    Java泛型是Java SE 5.0引入的一个重要特性,极大地提高了代码的类型安全性和重用性。在本文中,我们将深入探讨Java泛型的进阶概念,包括通配符、边界、类型擦除以及在实际开发中的应用。 1. 通配符 通配符在Java...

    java 泛型方法使用示例

    Java 泛型是Java SE 5.0引入的一...以上就是关于Java泛型方法的基本介绍和使用示例,希望对你有所帮助。如果你想要进一步了解或实践,可以参考提供的`GenericMethod.java`源代码文件,或者查阅`Java.jpg`中的相关图片。

Global site tag (gtag.js) - Google Analytics