JAVA泛型中的< T >和< ? >有什么区别?

T 代表一种类型

加在类上:class SuperClass{}

加在方法上:

public void fromArrayToCollection(T[] a, Collection c){}

方法上的代表括号里面要用到泛型参数,若类中传了泛型,此处可以不传,调用类型上面的泛型参数,前提是方法中使用的泛型与类中传来的泛型一致。

class People{

public void show(T a) {

}

}

T extends T2 指传的参数为T2或者T2的子类型。

?是通配符,泛指所有类型

一般用于定义一个引用变量,这么做的好处是,如下所示,定义一个sup的引用变量,就可以指向多个对象。

SuperClass<?> sup = new SuperClass(“lisi”);

sup = new SuperClass(new People());

sup = new SuperClass(new Animal());

若不用?,用固定的类型的话,则:

SuperClass sup1 = new SuperClass(“lisi”);

SuperClass sup2 = new SuperClass(“lisi”);

SuperClass sup3 = new SuperClass(“lisi”);

这就是?通配符的好处。

? extends T 指T类型或T的子类型

? super T 指T类型或T的父类型

这个两个一般也是和?一样用在定义引用变量中,但是传值范围不一样

T和?运用的地方有点不同,?是定义在引用变量上,T是类上或方法上

如果有泛型方法和非泛型方法,都满足条件,会执行非泛型方法

public void show(String s){

  System.out.println("1");

}

@Override

public void show(T a) {

  System.out.println("2");

}

1.在整个类中只有一处使用了泛型,使用时注意加了泛型了参数不能调用与参数类型有关的方法比如“+”,比如打印出任意参数化类型集合中的所有内容,就适合用通配符泛型<?>
public static void printCollecton(Collection <?> collection)
{
for(Object obj: collection)
{
System.out.println(obj);
}
}

  1. 当一个类型变量用来表达两个参数之间或者参数与返回值之间的关系时,即统一各类型变量在方法签名的两处被使用,或者类型变量在方法体代码中也被使用而不仅仅在签名的时候使用,这是应该用自定义泛型。泛型方可以调用一些时间类型的方法。比如集合的add方法。
    public static T autoConvertType(T obj)
    {
    return(T)obj;
    }

泛型三种:
[1]ArrayList al=new ArrayList();指定集合元素只能是T类型
[2]ArrayList<?> al=new ArrayList<?>();集合元素可以是任意类型,这种没有意义,一般是方法中,只是为了说明用法
[3]ArrayList<? extends E> al=new ArrayList<? extends E>();
泛型的限定:
? extends E:接收E类型或者E的子类型。
?super E:接收E类型或者E的父类型。

java泛型的两种用法:List是泛型方法,List<?>是限制通配符

List一般有两种用途:
1、定义一个通用的泛型方法。
public interface Dao{
List getList(){};
}

List getStringList(){
return dao.getList();//dao是一个实现类实例
}

List getIntList(){
return dao.getList();
}
上面接口的getList方法如果定义成List<?> ,后面就会报错。

2、限制方法的参数之间或参数和返回结果之间的关系。
List getList<T param1,T param2>
这样可以限制返回结果的类型以及两个参数的类型一致。

List<?>一般就是在泛型起一个限制作用。
public Class Fruit(){}

public Class Apple extends Fruit(){}

public void test(? extends Fruit){};

test(new Fruit());
test(new Apple());
test(new String()); //这个就会报错,
参数必须是Fruit或其子类。

““和”<?>",首先要区分开两种不同的场景:

第一,声明一个泛型类或泛型方法。
第二,使用泛型类或泛型方法。
类型参数“”主要用于第一种,声明泛型类或泛型方法。
无界通配符“<?>”主要用于第二种,使用泛型类或泛型方法

转载自https://www.cnblogs.com/jpfss/p/9929045.html

JAVA泛型尖括号中的 T 和 ? 有什么区别?相关推荐

  1. java 泛型机制_java中的泛型机制

    泛型 这种语法机制,只在程序编译阶段起作用,只是给编译器参考的.(运行阶段泛型没用) 使用了泛型好处是什么? 第一:集合中存储的元素类型统一. 第二:从集合中取出的元素类型是泛型指定的类型,不需要进行 ...

  2. java 正则 尖括号_使用JS正则表达式替换括号,尖括号等

    如下所示:function toTxt(str) { var RexStr = /\|\"|\'|\&/g str = str.replace(RexStr, function(Ma ...

  3. [转]JAVA泛型通配符T,E,K,V区别,T以及ClassT,Class?的区别

    原文地址:https://www.jianshu.com/p/95f349258afb 1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被 ...

  4. 不正确 有三种形式 说法 通配泛型_一看就懂 详解JAVA泛型通配符T,E,K,V区别...

    1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛 ...

  5. (转)JAVA泛型通配符T,E,K,V区别,T以及Class,Class的区别

    1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛 ...

  6. JAVA泛型通配符T,E,K,V区别,T以及ClassT,ClassT的区别

    原文地址:https://www.jianshu.com/p/95f349258afb 1. 先解释下泛型概念 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被 ...

  7. java replacefirst第n_Java中replace()、replaceFirst()和replaceAll()区别

    str.replace(str中被替换的,替换后的字符) replace和replaceAll是JAVA中常用的替换字符的方法,它们的区别是: 1)replace的参数是char和CharSequen ...

  8. java println和print_java中的print和println有区别吗

    java中的print和println有区别吗 发布时间:2020-07-01 11:55:01 来源:亿速云 阅读:118 作者:Leah java中的print和println有区别吗?针对这个问 ...

  9. java 泛型例子_java中的泛型的一些常见例子

    /** * @author Rollen-Holt 使用泛型 */ class hello { hello(){ } public T getName(){ return name; } public ...

最新文章

  1. 【二维树状数组】See you~
  2. Java编程入门100例之二十二(字符串查找)
  3. 创业,程序员心中说不出的痛
  4. C++描述杭电OJ 2016. 数据的交换输出 ||
  5. 使用Python批量提取并保存docx文档中的图片
  6. 乔治城计算机系如何,乔治城大学cs专业申请
  7. zoj 3261 Connections in Galaxy War
  8. NOI2022退役记
  9. 卡麦吉梅隆大学 计算机排名,2019年卡内基梅隆大学信息系统排名
  10. 2021.04.13丨sRNAnalyzer报错fastx_collapser: Invalid input: This looks like a multi-line FASTA file解决办法
  11. matlab能不能求不定积分,用MATLAB求定积分
  12. 最新天迹云通信短信分销系统源码+已修复完美版
  13. 【数学】Baby Step,Giant Step
  14. MySQL基础篇 | 连接查询、子查询(嵌套)
  15. 中国企业密钥管理(EKM)市场趋势报告、技术动态创新及市场预测
  16. JAVA并发编程的艺术-读书笔记
  17. 终端代理以及git加速
  18. 几行代码实现用Python输出表情包
  19. 爬虫 JavaScript 逆向进阶!利用 AST 技术还原混淆代码
  20. C++:寻找250(团体程序设计天梯赛)

热门文章

  1. 什么是框架?框架和库有什么区别?
  2. python中bytearray函数_Python内置函数—bytearray
  3. Java log日志
  4. 《统计学》——思考题第四章数据的概括性度量(贾俊平)
  5. C/C++中的数据类型转换()/static_cast/dynamic_cast/const_cast/reinterpret_cast
  6. Mybatis to_date方法(ORACLE)
  7. 符号“∑”和“Π”的用法。
  8. 使用STM32F103CBT6自制ST LINK V2-1多功能烧录器
  9. PET不干胶标签发展趋势
  10. 【python实战】利用selenium自动发信息给粉丝(CSDN)