【问题标题】:Java generics type parameter hidingJava泛型类型参数隐藏
【发布时间】:2011-12-14 22:28:45
【问题描述】:

我正在定义一个类:

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

编译器抱怨I 被I 隐藏。我猜I 第二次出现在定义中是隐藏在第一个范围内,好像变量I 可以分配给两种不同的类型。如何正确操作?

编辑:

这是一个内部类。完整的代码可以是:

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

现在的问题是,如果我将内部I 重新提名为J,我不确定I 和J 实际上是同一类型。

【问题讨论】:

  • 为我编译 - 您的代码中是否有类型 I 定义?
  • 同样,没有警告。
  • 是的,你说得对。这是一个内部类,外部类也使用 I。如果我在 J 中重新提名 I,那么我不能保证它们是相同的。还是?
  • 第二个I是第一个I。

标签: java generics warnings


【解决方案1】:

不要让内部类参数化:

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

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

【讨论】:

  • 我会接受这个,因为这回答了我的问题。它可能看起来像一个平庸的问题,但我的问题不同,后来我发现了。我的问题是内部类实际上是一个内部接口。无法避免在内部接口中显式声明类型,这将所有实现内部接口的内部类都搞砸了......
【解决方案2】:

如果I 已经在外部类中定义了,那么就做这个

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

你不能在你的内部类中重新定义I。内部类的I 与外部类的I 不同,如果这是你想要的,那么,重命名它。

HTH

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-27
    • 2015-11-28
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    相关资源
    最近更新 更多