Дженерики названия столкновения - PullRequest
6 голосов
/ 21 января 2012

Рассмотрим:

public interface Foo<T> {
    public static class X{}
    public void foobar(T t); 
}

public class Bar<X> {
    Foo<X> foo = new Foo<X>() {
        public void foobar(X t) {}
    };
}

Я не нашел способа выразить, что я имею в виду X из Bar<X>, а не Foo.X в реализации foobar(X t).Нет ли другого способа, кроме переименования универсального параметра X в Bar или статического внутреннего класса?

Ответы [ 2 ]

9 голосов
/ 21 января 2012

Я не думаю, что есть способ устранить неоднозначность с параметром типа, и я думаю, что это было разумное дизайнерское решение.

  1. Соглашения ясны, что параметры типа должны быть, если возможно, длиной в один символ, и оборотной стороной этого является то, что другие классы не должны иметь имен из одного символа.
  2. Если выЕсли бы у вас была возможность устранения неоднозначности, , тогда у вас была бы возможность переименовать параметр типа X в Bar<X>.Другими словами, если бы у вас была возможность сказать foobar(TypeParameter.X t), у вас была бы возможность просто использовать что-то отличное от X для параметра типа в Bar.Переименование X - это способ, которым вы избегаете столкновений имен.

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

0 голосов
/ 21 января 2012

компилятор даже не потрудится определить, имеете ли вы в виду Foo.X, он будет учитывать TypeParameter X независимо от того, если вы набрали что-то вроде:

public class Bar<X> {
    Foo<X> foo = new Foo<X>() {
        public void foobar(Foo.X t) {}
    };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...