?是通配符(占位符),可以表示任意一个,T只是一种替代,只能表示其中一个

假设有A,B,C三个类

<?>可以是A,B,C任意一个,每一个<?>之间没有关联

<T>如果确定了是A那之后的都是A,每一个<T>代表的是相同的

它们都是在类型不确定的时候或者为了支持多种类型的一种替代写法

对<T>的一些思考:

看到很多类定义时都带了<T>泛型,开始思考为什么要用到这个泛型,

不是在对象内部直接用Object对象也可以达到同样的效果,刚开始觉

得好像有点多余,后来发现如果直接用Object的话内部要经常用到类

型的强制转换,而<T>在建立时就传入了特定的的类型。

无法创建泛型数组,编译不通过

如果允许创建泛型数组,在编译期间,由于泛型擦除,

泛型数组中的对象将是Object,即泛型数组将是Object[ ],

那样可以在数组中放入多种对象类型,

假如你把一个原本是A类型的Object类型强转型成B类型

同时调用了不属于它的方法就会报java.lang.ClassCastException异常,

这就违反了泛型引入的原则

(如果一段代码在编译时没有提出“未经检查的转换”警告,

则程序在运行时不会引发ClasscastException异常)

。所以,Java不允许创建泛型数组。

泛型擦除的主要过程如下:

1).将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。

2).移除所有的类型参数。

<? extends T>上界通配符

表示一个生产者,只能获取,读取出来的东西只能存放在T或它的基类里,不能存

<? super T>下界通配符

表示一个消费者,一般用于存,获取只能放在Object对象里

PECS原则(producer-entends,consumer-super)

频繁往外读取内容的,适合用上界Extends。

经常往里插入的,适合用下界Super。

<?>与<T>的区别的更多相关文章

  1. <select>与<datalist>的区别

    size:下拉框中每次出现选项的个数 multiple:可以一次性选多个选项: disabled:时下拉框不可用,无法点击选项​ list:它的值应于id的值对应 datalist要与input标签一 ...

  2. [转]ThinkPHP中实例化对象M()和D()的区别,select和find的区别

    1.ThinkPHP中实例化对象M()和D()的区别 在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在于M方法实例化模型无需用户为每个数据表定义模型类,如果D方法没有找到定义的模型类,则会 ...

  3. JS-005-常见下拉列表 Select 和 datalist

    下拉列表在我们日常的网页浏览的过程中,随处可见,是 web 编程过程中大家非常熟悉的一个页面元素,随着 HTML 语言的日益强大,其在广大攻城狮的手中可谓是千变万化,有了很多不同的实现方式.本文主要以 ...

  4. ThinkPHP中实例化对象M()和D()的区别,select和find的区别

    原文:ThinkPHP中实例化对象M()和D()的区别,select和find的区别 1.ThinkPHP中实例化对象M()和D()的区别 在实例化的过程中,经常使用D方法和M方法,这两个方法的区别在 ...

  5. Select()和SelectMany()的区别

    Select与SelectMany的区别 Select() 和 SelectMany() 的工作都是依据源值生成一个或多个结果值. Select() 为每个源值生成一个结果值.因此,总体结果是一个与源 ...

  6. select 和epoll模型区别

    1.select 和epoll模型区别 1.1.网络IO模型概述 通常来说,网络IO可以抽象成用户态和内核态之间的数据交换.一次网络数据读取操作(read),可以拆分成两个步骤:1)网卡驱动等待数据准 ...

  7. python下的select模块使用 以及epoll与select、poll的区别

    python下的select模块使用 以及epoll与select.poll的区别 先说epoll与select.poll的区别(总结) 整理http://www.zhihu.com/question ...

  8. SQL中select与set的区别-转载

    下表列出 SET 与 SELECT 的区别   SELECT SET 同时对多个变量同时赋值时 支持 不支持 表达式返回多个值时 将返回的最后一个值赋给变量 出错 表达式未返回值时 变量保持原值 变量 ...

  9. select count(*)和select count(1)的区别 (转)

    A 一般情况下,Select Count (*)和Select Count(1)两着返回结果是一样的 假如表沒有主键(Primary key), 那么count(1)比count(*)快, 如果有主键 ...

  10. Select与SelectMany的区别

    Select() 和 SelectMany() 的工作都是依据源值生成一个或多个结果值. Select() 为每个源值生成一个结果值.因此,总体结果是一个与源集合具有相同元素数目的集合.与之相反,Se ...

随机推荐

  1. javascript总结17:javascript 函数简介

    1 释义:函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块. 2 格式:通过 function  关键字. function test(){ alert("您好"); } ...

  2. libtool: syntax error near unexpected token `]*

    ../libtool: line 543: syntax error near unexpected token `]*' ../libtool: line 543: `      *[\[\~\#\ ...

  3. Deep Visual-Semantic Alignments for Generating Image Descriptions(深度视觉-语义对应对于生成图像描述)

    https://cs.stanford.edu/people/karpathy/deepimagesent/ Abstract We present a model that generates na ...

  4. 【Android学习】Android工程资源命名禁忌

    在制作一个继续按钮时,将button的id设置为continue,发现报了错误,error: invalid symbol: 'continue' 一开始还以为是编码问题,后来百度之后才知道安卓And ...

  5. POJ - 2109 Power of Cryptography(高精度log+二分)

    Current work in cryptography involves (among other things) large prime numbers and computing powers ...

  6. python 日志模块工具类

    #!/usr/bin/env python # -*- coding: utf-8 -*- import logging # logName 日志中的某个格式化的字段名,logFile生成的日志文件名 ...

  7. sqlTransaction 简单的应用

    sqlTansaction表示要在 SQL Server 数据库中处理的 Transact-SQL 事务 static void Main(strng[] args) { //往数据库里面插入数据 s ...

  8. Kotlin 函数

    至于什么函数,在计算机里面就是一个密闭的执行程序的代码块(个人理解) 我们先来看看什么是函数 fun main(agrs : Array<String>) { println(" ...

  9. day02.3-元组内置方法

    元组——tuple的定义:test = (11,"alex",(22,33),[44,55],True) 特点:1. 元组是可迭代对象 2. 元组中元素是有序的,但其不可修改,也不 ...

  10. 趣图:向客户介绍的产品VS实际开发的产品

      趣图:客户需求 vs 最终产品 趣图:你永远想不到用户怎么使用你的产品