2015-10-07 60 views
1

我在Java 1.7中实现了一个链表,我不理解这种行为。说事代码的部分是这样的:泛型类中的私有迭代器奇怪的打字错误

public class LListSent<T> implements Iterable<T>{ 
    //... 
    public T get(int pos) { 
     //... 
    } 
    //... 
    private class LListSentIterator { 
     private final LListSent list; 
     private int currPos; 
     private LListSentIterator(LListSent list) { 
      this.list = list; 
      currPos = 0; 
     } 
     //... 
     @Override 
     public T next() { 
      return list.get(currPos++); //exception in this line 
     } 
    } 
} 

我得到的例外是:

incompatible Type: Object cannot be converted to T 
    where T is a type-variable: 
    T extends Object declared in class LListSent 

前夕虽然left.get返回T对象。为什么会发生?

回答

1

您的list变量的类型为LListSent这是原始类型(因此未参数化),因此在此实例上调用的get方法将返回Object而不是T

将变量的类型更改为LListSent<T>

请注意,这将起作用,因为LListSentIterator是一个内部类,可以访问类型变量T

一个清洁的解决方案是与一类参数S等你list变量将成为类的参数化到您的LListSentIterator类:LListSent<S>

+1

参数化LListSentIterator只会是必要的,如果它是一个静态类IMO。 – 0x539

+0

@ 0x539或者将LListSent.LListSentIterator#list替换为LListSent.this,或者将LListSent.LListSentIterator声明为带有通用约束的LListSent字段的private static class该类也被约束)。 –

+0

@BinkanSalaryman这是真的,我忘记了你可以使用'LListSent.this'。当然,这更好。 – 0x539