我有一个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>
最佳答案
简短答案,因为没有类型提示的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);
这样编译就可以了。