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;
具体请参见百度百科:http://baike.baidu.com/view/1436058.htm
以上是关于java中Class<T>类型和不写<T>的区别的主要内容,如果未能解决你的问题,请参考以下文章