我有一个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);


这样编译就可以了。

10-04 19:56