Java模板类无法编译

时间:2014-09-24 09:19:54

标签: java

我有类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>

2 个答案:

答案 0 :(得分:2)

问题1

public static <T> LList0<T> empty()

即使你的T类中的静态方法中有LList0,两个T也不同。静态方法中的通用T 隐藏(不使用)您班级中的T。也就是说,返回的LList0对象具有泛型类型X。你给了他们同样的T,实在令人困惑。这就是为什么你的第一线工作,但第二线没有。请记住,如果您为类声明了泛型类型A,并为其静态方法声明了BAB彼此无关,即使您将其命名为T

问题2

即使您修复了泛型类型问题,您的方法也无法按预期工作。因为每次调用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);

编译得很好。