`

关于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

分享到:
评论

相关推荐

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

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

    泛型中? 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中List<? extends T>与List<? super T>的区别(值得珍藏)

    这里的 &lt;T&gt; 表示泛型,T 表示泛型中装载的类型为T类型,等到需要的时候,我们可以具体这个 T。我们在使用动态数组实现 ArrayList 的时候,如果希望这个 ArrayList 不仅仅支持一个类型的话,我们可以给这个 ArrayList...

    Java 泛型 super T 中 super 怎么 理解?与 extends 有何不同? - 副本.md

    Java 泛型 super T 中 super 怎么 理解?与 extends 有何不同? - 副本

    java泛型总结.docx

    泛型类型:定义泛型类型时,使用尖括号,并在尖括号中指定类型参数。...例如,public static &lt;T extends Comparable&lt;T&gt;&gt; T max(T[] array)表示一个返回最大元素的泛型方法,且元素类型必须实现Comparable接口。

    Java 基础泛型.pdf

    Java泛型概念 Java泛型是一种在编译时进行类型检查和类型推断的机制,它可以让我们编写更加通用、可重用的代码,提高了代码的可读性和可维护性,同时保证了类型安全。 Java泛型的核心思想是类型参数化,即在类、接口...

    泛型dao 泛型dao 泛型dao

    泛型dao接口 :GenericDao&lt;T, ID extends Serializable&gt; 泛型作为DAO的通用接口 CRUD方法 dao接口 : PersonDAO extends GenericDao, Integer&gt; 可以不写代码,方法已经在父类泛型dao里了,这里为了说明:可扩展添加 ...

    java中的泛型通配符的使用

    这是小编自己学习的心得,想通过这个平台对大家共享,希望大家前来评价一下,我及时改正,通配符这个是在泛型中使用的一个可以帮助大家更加方便简洁的去利用代码,它是其他泛型的一个总父类!

    JDK 1.5的泛型實現(Generics in JDK 1.5)

    閱讀本文之前,如果自覺基礎不夠,可以補充閱讀適才提到的《Java泛型技術之 發展》,那是一篇非常完整的文章,可助您完整認識泛型技術的來龍去脈。 Sun JDK的泛型發展歷史要從 1.3版說起。該版本配合 GJ,正式...

    generify:适用于 Android 的 Gradle 插件,可让您在 XML 布局中使用 Java 泛型

    适用于 Android 的 Gradle 插件,可让您在 XML 布局中使用 Java 泛型。 用法 在常规“android”插件之后应用build.gradle的插件: buildscript { repositories { mavenCentral() } dependencies { classpath ...

    Kotlin中协变、逆变和不变示例详解

    super T&gt; 通配符型变约束,而是采用类似 C# 的 in,out 用于支持协变和逆变,这同时避免了处理子类型化,父类化的问题(即Java泛型中典型的List&lt;T&gt; 不是 List&lt;Object&gt;的子类型的问题); 基本的泛型语法可以...

    \java超强笔记(超级经典)

    public class MyExpection&lt;T&gt; extends Exception{ } //编译错误 可以抛出(throws)泛型类,但catch的参数不能是泛型类。 注意: 编译时类型的泛型和运行时类型的泛型一定要一致,没有多态。 ...

    虚拟数据层 Struts2、Hibernate、Spring整合的泛型DAO Version 2010.9.27

    泛型dao接口 :GenericDao&lt;T, ID extends Serializable&gt; 泛型作为DAO的通用接口 CRUD方法 dao接口 : PersonDAO extends GenericDao, Integer&gt; 可以不写代码,方法已经在父类泛型dao里了,这里为了说明:可扩展添加 ...

    Java 高级特性.doc

    4、泛型的参数类型可以使用extends语句,例如&lt;T extends superclass&gt;。习惯上成为“有界类型”。 5、泛型的参数类型还可以是通配符类型。例如Class&lt;?&gt; classType = Class.forName(java.lang.String); 例子: a..使用...

    java8集合源码分析-Project:工程目录

    java8 集合源码分析 To Be Top Javaer - Java工程师成神之路 主要版本 更新时间 备注 v1.0 2019-04-10 首次发布 一、基础篇 面向对象 什么是面向对象 平台无关性 值传递 封装、继承、多态 Java基础知识 基本数据类型...

    java常用工具类的使用

    1. Java工具概述 很多人初学程序时,总是在想,那么多的算法该怎么写呀?那么多的数据结构都不熟悉,该怎么实现呀?总是担心英语不好程序学不精通,数学不好写程序无法达到巅峰。学的程序越多,不懂的知识越多。 ...

    整理后java开发全套达内学习笔记(含练习)

    Generic [java] 泛型 [dʒi'nerik] goto (保留字) 跳转 heap n.堆 [hi:p] implements (关键字) 实现 ['implimәnt] import (关键字) 引入(进口,输入) Info n.信息 (information [,infә'meiʃәn] ) ...

    GenericAdapterSample:此示例应用程序描述了如何通过实现通用的Listview适配器在Android中使用通用的

    GenericAdapterSample 此示例应用程序描述了如何通过实现通用的Listview适配器在Android中使用通用。通用介绍泛型最初是在Java5中引入的。... public abstract class GenericCommonAdapter &lt;T&gt; extends

    mapper-base2:该项目直接从 mapperbase 模块复制而来,对接口中的泛型增加了主键和 Example,可以更严格的控制参数

    该项目直接从 mapper/base 模块复制而来,对接口中的泛型增加了主键和 Example,可以更严格的控制参数。 主要 Mapper 接口为 tk.mybatis.mapper.common2.Mapper&lt;T&gt;。 注意包名中的 common2 使用示例如下: public ...

    网络获取json解析json以及子线程显示

    public class MainActivity extends AppCompatActivity implements View.OnClickListener { RecyclerView recyclerView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate...

Global site tag (gtag.js) - Google Analytics