java中Class<T>类型和不写<T>的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中Class<T>类型和不写<T>的区别相关的知识,希望对你有一定的参考价值。

图1是正常情况下,图2错误,图3也是错误,不写是void吗?图1图2比较为什么我下面就是错的,有什么关系?

要么不写泛型, 默认为Object
要么写尖括号<?> 也是Object
否则就老实写好类型.追问

可是你看图2和图3,如果按你说的不写是Object(图2),手动写Object(图3),既然都是Object的话为什么错误的地方不一样。
我现在主要的问题就是图1与图2写与不写泛型对下面有什么影响,看源码知道getAnnotation方法是属于Class类的,但是它们的泛型分别是T和A,并无什么直接关联,为什么不写Class类型的泛型会导致下面的错误。

追答

你的图怎么传的和轮播图一样, 看着有点难受.

"看源码知道getAnnotation方法是属于Class类的,但是它们的泛型分别是T和A,并无什么直接关联"  

这里理解的有点问题, T 和 A 是泛型的占位符, 只要有某一处占位符能获得指定的泛型信息, 其他的占位符就能替换成对应的泛型类型.

编译器会根据零星信息猜测类型信息,  如果猜不到就按照Object处理, 但是不是说 对于编译器 Class<Object> 和 Class class 等效!

由于泛型擦除的原因,存在以下事实:

对于编译器: Class class1 不等于 Class<Object> class2

对于JVM: class1 == class2

m( _ _ )m

图二里: 你没有指定类型, 编译器一般会提示一个警告, 如果你执意如此, 他就默认你知道你在做什么,(你自己保证Class引用的泛型和 Class对象的类型一致)  但是他不知道具体类型,就当Object处理.

当你要从一个Class<Object>类型中取出注解, 那肯定报错啊.

图三: 你手动指定了Object, 于是编译器看到了这样的场面:

Class<Object> clazz = OtherClass.class;

Object 和 OtherClass类型不一致! 对编译器而言,这等同于把String赋值给Integer   类型不匹配, 因为你指定类型了.

以上是我的个人理解, 描述不是很准确, 而且原理来自个人脑补, 仅供参考.

如果想详细了解泛型, 参考<Java编程思想>中的相关内容,了解 泛型的实现原理 泛型擦除的范围 , 还有 编译器的类型推断

参考技术A ava泛型没有<gt;这种语法。 一般是<?>和<T>形式: 1、ArrayList<T> al=new ArrayList<T>();指定集合元素只能是T类型。

java 中类型前面有个<String> Stream是啥意思

在查看java API的时候,看到<T> Stream<T>这样的返回类型,后面是<T>代表的是泛型,但前面是<T>代表什么?

解释后面的T的,比如你希望后面的T是一个Student类型,就这样写<T extends Student> Stream<T>
什么都不写,就相当于任何,即<T extends Object> Stream<T>追问

API 好像都没有返回 Stream这种类型的,都是 Stream ,按照你的说法,那直接写成Stream不就行了?

追答

是可以啊,但是你必须要定义过T才行,比如这个:
public class Test2

public List get(E e)

return null;


参考技术A <T>是泛型,泛指任何类型。

具体请参见百度百科:http://baike.baidu.com/view/1436058.htm

以上是关于java中Class<T>类型和不写<T>的区别的主要内容,如果未能解决你的问题,请参考以下文章

java中返回值类型<T> T 这两个T分别代表啥?

java,关于利用反射自动设置List<T>中T的类型

java中Class<T> 和Class<?>

java 中类型前面有个<String> Stream是啥意思

java中<T>问题

Java中定义泛型<T>时,怎么获得泛型的类型