Скрытие параметров типа универсального Java-кода - PullRequest
5 голосов
/ 15 декабря 2011

Я определяю класс:

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

компилятор жалуется на то, что I скрыт I. Я предполагаю, что второй раз, когда I появляется в определении, скрывает в области видимости первый, как если бы переменная I могла быть назначена двум различным типам. Как это сделать правильно?

Edit:

это внутренний класс. полный код может быть:

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

Теперь проблема в том, что если я переименую внутренний I в J, я не уверен, что I и J на самом деле - это те же типы.

Ответы [ 2 ]

9 голосов
/ 15 декабря 2011

Не делайте внутренний класс параметризованным:

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

Как внутренний (нестатический вложенный) класс, I, как определено в объявлении Baz, все равно будет иметь значение в Foo, поскольку каждый Foo будет иметь неявную ссылку на свой внешний Baz экземпляр.

3 голосов
/ 15 декабря 2011

Если I уже определен во внешнем классе, просто сделайте это

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

Вы не можете переопределить I в своем внутреннем классе. I внутреннего класса будет чем-то другим, чем I внешнего класса, если это то, что вы хотите, ну, переименуйте его.

НТН

...