我发现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
对此感到抱歉!
答案 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.
}