2011-03-18 114 views
2

我想要一个泛型类实现Iterable(我们称之为ImplIterable)类型T,它实现了一个类(不是泛型类型)的Iterable接口;例如:泛型类实现Iterable

public class ImplIterable <T> implements Iterable<A> { 
    private A[] tab; 

    public Iterator<A> iterator() { 
     return new ImplIterator(); 
    } 

    // doesn't work - but compiles correctly. 
    private class ImplIterator implements Iterator<A> { 
     public boolean hasNext() { return true; } 

     public A next() { return null; } 

     public void remove() {} 
    } 
} 

其中A是某个类。现在,这个代码将不能编译:

ImplIterable iable = new ImplIterable(); 
for (A a : iable) { 
    a.aStuff(); 
} 

但这会:

Iterable<A> = new ImplIterable(); 
for (A a : iable) { 
    a.aStuff(); 
} 

我不明白为什么后者不编译,为什么我不能遍历ImplIterable如果正确地实现迭代。我做错了什么?有没有解决这类问题的方法?

+0

它给了什么错误? – SLaks 2011-03-18 20:08:36

+0

'不兼容的类型 found:java.lang.Object required:java.lang.String' – SLaks 2011-03-18 20:12:52

回答

3

当您使用不含泛型参数的泛型类时,该类中的所有泛型都被禁用。

由于ImplIterable是通用的,因此您将其用作非泛型类,其内部的通用参数消失,并且它变为Iterable(非泛型)Object s。

+0

Thanks!我不知道泛型以这种方式工作。 ImplIterable 的作品,如同任何类型。所以前一种情况是有效的,因为在Iterable 中的泛型类型没有被擦除 - 这是有道理的。 – Bartek 2011-03-18 20:20:55

+0

不客气。这是出于兼容性的原因。你应该通过点击空心支票来接受这个答案。 – SLaks 2011-03-18 20:29:12