public class Test {
public static void main(String [] args){
Plate<? extends Fruit> p = new Plate<Apple>(new Apple());
Food food = p.get();
Fruit fruit = p.get(); //ERROR
// p.set(new Fruit());
// p.set(new Orange());
// p.set(new Apple());
//error
// Apple apple = p.get();
Plate<? super Fruit> p1 = new Plate<Fruit>(new Fruit());
p1.set(new Apple());
p1.set(new Orange());
p1.set(new Fruit());
Object object = p1.get(); }
}
class Plate<T>{
private T item;
public Plate(T t){
item = t;
}
public T get() {
return item;
}
public void set(T item) {
this.item = item;
}
} //父类
class Food {
void eatFood(){
System.out.println("eatFood");
}
}
//子类1
class Fruit extends Food{
void eatFruit(){
System.out.println("eatFruit");
}
}
class Meat extends Food{
void eatMeat(){
System.out.println("eatMeat");
}
}
//子类2
class Apple extends Fruit{
void eatApple(){
System.out.println("eatApple");
}
}
class Orange extends Fruit{
void eatOrange(){
System.out.println("eatOrange");
}
}
class Pork extends Meat{
void eatPork(){
System.out.println("eatPork");
}
} class Beaf extends Meat{
void eatBeaf(){
System.out.println("eatBeaf");
}
}

<? extends Fruit> 相当于是什么意思? 就是 ? extends Fruit 里面是Fruit类或者他的子类但是具体什么类型不知道
所以可能是Fruit 可能是Apple可能是Orange 这里面相当于标记了一个占位符:CAP#1 但是不能插入他的子类了,
<?> 不写默认是<? extends Object>
所以取得时候只能取父类的类型 向下转型嘛 父类new子类对象可以
所以这种写法适合去取 因为set会失效
Plate相当于一个容器 <?>与<T>不同的是 <T>是可以已知的
<? extends Fruit> 规定了他的上界限是 Fruit 但是下面的类型不能确定
所以我不能存,因为如果我的下面的类型细度比较大,存进去的时候就会有信息丢失 ,但是我取的时候可以取他父类的类型这样就没有丢失
相反的可以这样 <? super Fruit> 这里面存的是Fruit的父类 那么就不能插入Fruit的父类了 但是向下转型只要是子类都是可以
放进去,粒度比这个小都可以放进去
取得时候只能取到<? super Fruit> 相当与是没有上限的父类 那就是Object类

泛型< ? extends > <? super> 理解的更多相关文章

  1. Android开发之深入理解泛型extends和super的区别

    摘要: 什么是泛型?什么是擦除边界?什么是上界限定或下界限定(子类型限定或超类型限定)?什么是类型安全?泛型extends关和super关键字结合通配符?使用的区别,两种泛型在实际Android开发中 ...

  2. 【Java 泛型】之 <? super T> 和<? extends T> 中 super ,extends如何理解?有何异同?

    Java 泛型 <? super T> 和<? extendsT>中 super ,extends怎么 理解?有何不同? 简介 前两篇文章介绍了泛型的基本用法.类型擦除以及泛型 ...

  3. Atitit 泛型原理与理解attilax总结

    Atitit 泛型原理与理解attilax总结 1. 泛型历史11.1.1. 由来11.2. 为什么需要泛型,类型安全21.3. 7.泛型的好处22. 泛型的机制编辑22.1.1. 机制32.1.2. ...

  4. ES6学习笔记<一> let const class extends super

    学习参考地址1  学习参考地址2 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015:也 ...

  5. java 泛型通配符 extends, super

    引自:http://sharewind.iteye.com/blog/1622164 关键字说明 ? 通配符类型 <? extends T> 表示类型的上界,表示参数化类型的可能是T 或是 ...

  6. AJPFX详解泛型中super和extends关键字

    首先,我们定义两个类,A和B,并且假设B继承自A.下面的代码中,定义了几个静态泛型方法,这几个例子随便写的,并不是特别完善,我们主要考量编译失败的问题: Java代码  public class Ge ...

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

    原文出处: 并发编程网 经常发现有List<? super T>.Set<? extends T>的声明,是什么意思呢?<? super T>表示包括T在内的任何T ...

  8. JAVA泛型中的有界类型(extends super)(转)

    JDK1.5中引入了泛型(Generic)机制.泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. Ja ...

  9. JAVA 泛型通配符 ? EXTENDS SUPER 的用法

    1. <? extends Hero> ArrayList heroList<? extends Hero> 表示这是一个Hero泛型或者其子类泛型heroList 的泛型可能 ...

随机推荐

  1. /usr/bin/ld: cannot find -lperconaserverclient_r 解决

    编译sqladvisor安装遇到: [root@localhost sqladvisor]# cd SQLAdvisor/sqladvisor/ [root@localhost sqladvisor] ...

  2. 协作式取消 CancellationTokenSource

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. Visual Studio 跨平台開發實戰(5) - Xamarin Android 多頁面應用程式開發 (转帖)

    前言 大部份的Android 都具有實體或虛擬的Back鍵. 因此在處理多頁面應用程式時, 與先前所介紹的iOS Navigation controller 比較起來會簡單許多. 1. 開啟Visua ...

  4. CentOS 7进入救援模式的方法

    CentOS 7版本进入救援模式并修改密码:方法1: runlevel 显示当前的运行级别(进入救援模式需要进入单用户模式) 方法2: ①.开机时随便按下键盘,进入系统选择菜单 ②.选择第一项,按e键 ...

  5. windows系统PHP7开启curl_init

    1.php.ini,开启extension=php_curl.dll,去掉去掉前面的“;” 2.检查php.ini的extension_dir值是哪个目录(也就是插件扩展目录,比如php_curl.d ...

  6. java中Filter过滤器处理中文乱码的方法

    注意问题:在学习用selvert的过滤器filter处理中文乱码时,在filter配置初始化时用了utf-8处理中文乱码,而在提交的jsp页面中却用了gbk.虽然两种都可以出来中文乱码,但是却造成了处 ...

  7. Git fetch & pull 区别

    1 简单概括 2 git fetch 的用法 3 git pull的用法 文章来源:https://blog.csdn.net/qq_36113598/article/details/78906882

  8. 数据库~Mysql里的Explain说明

    对于mysql的执行计划可以在select前添加Explain来实现,它可以告诉我们你的语句性能如何. 下面是对explain的具体说明,也都是官方的,以后进行参考. id SELECT识别符.这是S ...

  9. JavaScript设计模式-6.封装

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. ie和火狐事件addEventListener()及attachEvent()区别分析

    Mozilla中: addEventListener的使用方式: target.addEventListener(type, listener, useCapture); target: 文档节点.d ...