具有泛型类型参数的Java类,该参数实例化不同的通用接口

时间:2015-11-16 20:26:49

标签: java generics

我发现number questions the <main> element关于无法使用不同的类型参数两次实现相同接口的java限制。 (例如,你不能Iterable<String>Iterable<Integer>),但我还没有找到任何关于以下情况的讨论。

我可以说

    public class A implements Iterable<Integer> {    
        public Iterator<Integer> iterator() {
            throw new UnsupportedOperationException();
        }
    }

我可以说

    public class A<T> {
        T getFoo() { 
            throw new UnsupportedOperationException();
        }
        void setFoo(T foo) { 
            throw new UnsupportedOperationException();
        }
    }

但我不清楚为什么不允许以下内容。 [见下面的更正。] 这似乎已经是第一个案例&#34; drop&#34; A的通用规范中的Integer类型(在#1的情况下,我没有说A<Integer>。)那么为什么我们不能像这样给A一个新的类型?

    public class A<T> implements Iterable<Integer> {
        T getFoo() { 
            throw new UnsupportedOperationException();
        }
        void setFoo(T foo) { 
            throw new UnsupportedOperationException();
        }
        public Iterator<Integer> iterator() {
            throw new UnsupportedOperationException();
        }

    }

顺便说一下,如果我将第一个案例改为

    public class A<Integer> implements Iterable<Integer> {

我得到了一个&#34;隐藏&#34;警告,Integer(我在左边假设)隐藏了另一种类型Integer

实际上,这不太对!将其更改为

    public class A<String> implements Iterable<Integer> {

表示String隐藏String,而不隐藏Integer。我甚至不确定这意味着什么。 A<String>允许Iterable<Integer>,而A<T>则不允许{ - 1}} - 这是我提问的关键。

<小时/> 修改

我发现了我的例子的问题。例如,我从我们自己的界面Iterable<Integer>更改为LinkableVertex<OurLinkClass>,认为它没有任何区别。 OurLinkClass已经实施LinkableEdge<A>。 Eclipse中的实际错误是:

Bound mismatch: The type OurLinkClass is not a valid substitute for the
bounded parameter <E extends LinkableEdge<? extends LinkableVertex<E>>> of 
the type LinkableVertex<E>

(如果它是相关的,这是一对递归的接口:LinkableVertex<E extends LinkableEdge<? extends LinkableVertex<E>>>LinkableEdge<V extends LinkableVertex<? extends LinkableEdge<V>>>

那就是说,虽然我还没有把它全部清理干净,而且我不确定为什么需要额外的类型而不仅仅是原始类型警告,问题可能就像更改{一样简单} {1}}实施OurLinkClass

对此感到抱歉!

1 个答案:

答案 0 :(得分:2)

隐藏意味着您的通用名称可能隐藏了一个类:java.lang.String

将泛型用于类定义并将其用于变量(局部,参数,字段等)定义之间存在巨大差异。

定义它是不一样的:

public class A<String> {
             //^----^----- name of your generic used in the class
    public String getFoo() {
    }
}

宣布:

A<String> a; //here A will work with generics but using java.lang.String class

此外,您的类可以实现使用泛型的接口,但这并不意味着您的类也必须使用泛型。这是一个例子:

class MyClass<T> implements Iterable<T> {
    //this means MyClass will use a generic of name T and implements Iterable
    //to support the same generic T used in the class
}

class AnotherClass implements Iterable<String> {
    //this means that AnotherClass doesn't support generics
    //and implements Iterable for java.lang.String only.
}