Java泛型类型参数隐藏

5

我正在定义一个类:

class Foo<I extends Bar & Comparable<I>> {
}

编译器抱怨I被第二个I隐藏了。我猜测在定义中第二次出现的I在作用域上隐藏了第一次出现的I,就好像变量I可以分配给两种不同的类型。如何正确地处理呢?
编辑:
这是一个内部类。完整代码如下:
class Baz<I> {
    class Foo<I extends Bar & Comparable<I>> {
    }
}

现在的问题是,如果我重新指定内部的IJ,我不确定IJ实际上是否是相同的类型。


4
对于我来说编译通过了 - 你的代码中是否定义了类型I - Paul Bellora
1
一样的,对我没有警告。 - n1r3
是的,你说得对。这是一个内部类,外部类也在使用I。如果我在J中重新命名I,那么我就不能保证它们是相同的。或者呢? - marcorossi
第二个 I 是第一个 I - Bhesh Gurung
2个回答

9

不要将内部类参数化:

class Baz<I extends Bar & Comparable<I>> {
   class Foo {
   }
}

作为内部(非静态嵌套)类,在 Baz 声明中定义的 I 仍将在 Foo 中具有意义,因为每个 Foo 都会隐式引用其外部的 Baz 实例。

我会接受这个答案,因为它回答了我的问题。虽然这个问题看起来很平凡,但我的问题却不同,后来我才发现。我的问题是内部类实际上是一个内部接口。无法避免在内部接口中明确声明类型,这对于实现内部接口的内部类造成了混乱... - marcorossi

3
如果在外部类中已经定义了I,只需执行以下操作:
public class Outer<I extends Bar & Comparable<I>> {
  public class Foo<I> {
  } 
}

您不能在内部类中重新定义I。如果您想要内部类的I与外部类的I不同,那么请将其重命名。

希望对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接