我有类LList,它代表T类型的特定元素集合。该类有一个静态方法“empty()”和方法“ins”
public static <T> LList0<T> empty() {
LList0<T> emptyLList0 = new LList0<T>();
emptyLList0.init = true;
emptyLList0.list = null;
emptyLList0.rest = null;
emptyLList0.name = "empty";
return emptyLList0;
}
public LList0<T> ins(T o) {
LList0<T> c = new LList0<T>();
c.list = new Vector<T>();
c.list.add(o);
c.rest = this;
c.init = true;
return c;
}
我不明白为什么
LList0<?> s4 = LList0.empty().ins(1).ins(2).ins(3);
有效但
LList0<Integer> s4 = LList0.empty().ins(1).ins(2).ins(3);
不起作用
为什么在第一种情况下,编译器会知道在第二种情况下添加整数会产生错误?
type mismatch: cannot convert from LList<Object> to LList<Integer>
答案 0 :(得分:2)
public static <T> LList0<T> empty()
即使你的T
类中的静态方法中有LList0
,两个T
也不同。静态方法中的通用T
隐藏(不使用)您班级中的T
。也就是说,返回的LList0
对象具有泛型类型X
。你给了他们同样的T
,实在令人困惑。这就是为什么你的第一线工作,但第二线没有。请记住,如果您为类声明了泛型类型A
,并为其静态方法声明了B
。 A
和B
彼此无关,即使您将其命名为T
!
即使您修复了泛型类型问题,您的方法也无法按预期工作。因为每次调用inc()
时,该方法都会生成一个新的LList0
对象,如果您调用...inc(1).inc(2).inc(3)
,则返回的LList0
只有一个元素:3
< / p>
答案 1 :(得分:1)
简短回答,因为LList0.empty()
没有类型提示会返回LList0<Object>
。
在第一种情况下,LList0<?> s4 = LList0.empty().ins(1);
LList0<Object>
已投放到LList0<?>
,效果很好。
在第二种情况LList0<Integer> s4 = LList0.empty().ins(1);
中,您尝试将LList0<Object>
转换为LList0<Integer>
,但由于显而易见的原因而无法编译。
您需要解决的问题是在调用LList0.empty
方法时添加类型提示。
LList0<Integer> s5 = LList0.<Integer>empty().ins(1);
编译得很好。