返回信息流为什么wildSubtype编译通过,而wildSupertype报错,想不通,求指导
wildSupertype给出的错误提示是The method wildSupertype(Holder<? super T>, T) in the type Test is not applicable for the arguments (Holder<capture#5-of ?>, Long)
为什么wildSubtype不会有对应的类似这样的错误?
这是一条镜像帖。来源:北邮人论坛 / java / #47491同步于 2016/1/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
一个java泛型问题
SimbaF
2016/1/20镜像同步8 回复
订阅后,新回复会通过你的通知中心匿名送达。
8 条回复
在声明unbounded这个Holder的时候,已经默认只能持有Long或者Long的子类型了,所以Subtype能编译成功,而superType编译不通过。。。
不知道解释的对不对哈,听听暖神怎么说?[em21][em21]
请问unbounded不是被声明成Holder<?>了吗,编译时不是与原生类似,相当于Holder<Object>吗,为什么会默认为Long或他的子类呢,Holder<? extends Long>才是持有Long或Long的子类型吧?求指教
【 在 x530309882 的大作中提到: 】
: 在声明unbounded这个Holder的时候,已经默认只能持有Long或者Long的子类型了,所以Subtype能编译成功,而superType编译不通过。。。
: 不知道解释的对不对哈,听听暖神怎么说?
【 在 SimbaF 的大作中提到: 】
: 请问unbounded不是被声明成Holder<?>了吗,编译时不是与原生类似,相当于Holder<Object>吗,为什么会默认为Long或他的子类呢,Holder<? extends Long>才是持有Long或Long的子类型吧?求指教
我觉得Holder<?>不相当于Holder<Object>,而是相当于某种特定类型,Holeder<? extends T>能编译成功是能确定它的类型起码是T(这里相当于Long),而Holder<? super T>无法确定类型。
不知道解释的对不对[ema1]
wildSubType(unbounded, lng), 编译器推断出来的类型T(inferred type)是 Object,而不是long,既然推断T是Object ,那 Holder<?>自然是可以赋值给Holder<? extends Object>的。 所以这里你传入任何 (Holder<?> h, p2) 都是可以通过的。
比如,有自定义的class A, 然后调用 wildSubType(unbounded, new A()); 也是可以通过,这证明T并没有被推断为Long,你这里传入Long类型的lng,只是更迷惑了自己,认为编译推断T为Long了。
而wildSuperType的时候,编译器的错误信息已经很清楚了,他从你的调用推断不出T到底是何种类型,所以会报错。报错如下(注意reason那一行):
java: method wildSuperType in class Holder<T> cannot be applied to given types;
required: Holder<? super T>,T
found: Holder<capture#1 of ?>,java.lang.Long
reason: cannot infer type-variable(s) T
(argument mismatch; Holder<capture#1 of ?> cannot be converted to Holder<? super T>)
终于懂了,谢谢大神[ema11][ema11][ema11]
【 在 h0ngyue 的大作中提到: 】
: wildSubType(unbounded, lng), 编译器推断出来的类型T(inferred type)是 Object,而不是long,既然推断T是Object ,那 Holder<?>自然是可以赋值给Holder<? extends Object>的。 所以这里你传入任何 (Holder<?> h, p2) 都是可以通过的。
: 比如,有自定义的class A, 然后调用 wildSubType(unbounded, new A()); 也是可以通过,这证明T并没有被推断为Long,你这里传入Long类型的lng,只是更迷惑了自己,认为编译推断T为Long了。
: 而wildSuperType的时候,编译器的错误信息已经很清楚了,他从你的调用推断不出T到底是何种类型,所以会报错。报错如下(注意reason那一行):
: ...................