java wildcard_java泛型 wildcard

java wildcard_java泛型 wildcardimportjava util ArrayList importjava util List publicclassW publicstatic String args Itemitem newItem newDog item get ItemextendsP gt item2 newItem newDog

import java.util.ArrayList;

import java.util.List;

public class WildCard {

public static void main(String[] args) {

Item item = new Item(new Dog());

item.get();

Item extends Pet> item2 = new Item(new Dog());

item2.get().out();

/知道某种限制,但是不知道具体是什么/

List extends Pet> list = new ArrayList();

/

* The method add(capture#2-of ? extends Pet) in the type List

* is not applicable for the arguments (Dog)

* list.add(new Dog());

* 从错误代码得知,编译期list的类型是List extends Pet>,所以通配符还是个未知类型;

* 只知道是某种Pet的子类,但是并不知道具体的子类是什么,无法确保类型兼容;

* 即使list.add(new Object()); (Object类型与Pet的子类不兼容) 也是不可以的;

* list.add(null);这个可以;所以对于使用通配符的泛型,只能“取”不能“加”;

* 编译器只允许加null;因为只有 Pet的子类 = null;等式成立;

*/

//list.get(0);

List super Dog> list2 = new ArrayList();

/

* 这关系到泛型的边界(bounds),list通配符使用的是上边界,无法确定具体的类;

* 这里list2用的是下边界,取放的是Dog某种超类,但是并不知道具体的超类是什么;

* 我们只知道Dog的子类可以跟Dog超类类型兼容

* 所以这种形式的通配符只能“存”不能“取”

*/

list2.add(new Dog());

/

* list2.add(new Object());

*/

list2.add(new PettyDog());

/ClassCastException/

//list2.add((Dog) new Run());

}

}

interface Pet {

public void out();

}

class Item {

T item;

public Item(T item) {

this.item = item;

}

public T get() {

return item;

}

public void put(T item) {

}

}

class Run {}

class Dog extends Run implements Pet {

@Override

public void out() {

System.out.println(“The Dog!”);

}

public void getMsg(Item> item) {

item.get();

/

*The method put(capture#3-of ?) in the type Item

* is not applicable for the arguments (Item)

* capture:占位符被称为这个特殊通配符的捕获

* item.put(item);

*/

}

}

class PettyDog extends Dog {

}

推荐阅读:http://www.ibm.com/developerworks/cn/java/j-jtp04298.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/205291.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午6:21
下一篇 2026年3月19日 下午6:21


相关推荐

  • Electron教程(三)如何打包 electron 程序:electron-forge 的使用教程

    Electron教程(三)如何打包 electron 程序:electron-forge 的使用教程中定义的是生成的可执行文件的 icon 名字 关于信息等 packgerConfi 是另一个插件使用的配置 其官方的具体配置说明如下 electron forge 官方对应 packgerConfi 的说明 electron packger 官方配置参数说明 外层是通用的 各平台 macOSWindows 通用

    2026年3月17日
    2
  • 常用数字音频功放芯片-音频放大器

    常用数字音频功放芯片-音频放大器功放作为各类音响器材设备中的重要组成部分,作用就是把来自音源或前级放大器的弱信号放大,推动音箱放声,一套良好的音响系统功放的作用功不可没。功放的主要性能指标有输出功率,频率响应,失真度,信噪比,输出阻抗,阻尼系数等。由于考虑功率、阻抗、失真、动态以及不同的使用范围和控制调节功能,不同的功放在内部的信号处理、线路设计和生产工艺上也各不相同,由于各厂家的测量方法不一样,所以出现了一些名目不同的叫法。例如额定输出功率,最大输出功率,音乐输出功率,峰值音乐输出功率。数字音频处理功放芯片在影响声卡的功能和性能

    2022年5月22日
    46
  • .net杂记 (调用EXE 获取路径 target VB DIV C# Split 页面之间传递值 更改session时间 EXCEL操作 控制电子邮件Mail input记录值的窍门)…「建议收藏」

    .net杂记 (调用EXE 获取路径 target VB DIV C# Split 页面之间传递值 更改session时间 EXCEL操作 控制电子邮件Mail input记录值的窍门)…「建议收藏」//获取路径中文件名Path.GetFileName(pFullPath)判断文件是否存在File.Exists(路径文件)控制fileUpload控件,不让更改里面的内容,只可以选择contentEditable=”false”用来验证fileUpload控件中的上传的图片格式的javascript脚本document.getElementById(“Fil…

    2026年4月15日
    6
  • 平面图上的欧拉公式

    平面图上的欧拉公式V-E+F=2,V、E、F表示顶点数、边数、面数。

    2022年5月26日
    40
  • 常用字符编码及乱码分析[通俗易懂]

    常用字符编码及乱码分析[通俗易懂]常见的编码GBK、GB2312:表示国标编码,GDB包含简体中文和繁体中文,而DB2312只包含简体中文,也就是说,这两种编码都是描述中文的编码UNICODE编码:Java提供的16进制编码,可以描述世界上任意的文字信息,但是有个问题,若现在所有的字母都使用16进制编码,那么这个编码太庞大了,会造成网络传输的负担ISO8859-1:国际通用编码,但是所有的编码都需要进行转换UTF编码:相…

    2022年5月29日
    56
  • 开源代理软件GAppProxy

    开源代理软件GAppProxy前些天发现了一个开源的 HTTPProxy 软件 GAppProxy 使用了几天 发现其速度非常快 很值得推荐 GAppProxy 使用 Python 编写并运行于 GoogleAppEng 上 GAppProxy 是一个完整的 Proxy 解决方案 与常见的 HTTPProxy 不同 GAppProxy 运行在 GoogleAppEng 上 不需要专门的服务器 这是最大优势 普通 Wi

    2026年3月18日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号