Что делает имя универсального параметра типа универсальным? - PullRequest
0 голосов
/ 04 декабря 2018

Я пишу руководство по java для себя, и мне нравится приводить достоверные факты. Кажется, я не могу описать параметр универсального типа.Мне интересно, какое имя отображается как универсальный тип для компилятора, а не существующий объект.Я знаю, что условным обозначением является буква «Т» и другие отдельные буквыНо я видел в oracle.docs.com такой пример:

class name<T1, T2, ..., Tn>{}

Так что теперь я в замешательстве.Чтобы компилятор принял имя в качестве параметра универсального типа, должен ли существовать только класс с таким именем?Если бы у меня был класс Boby:

class Boby{ ... }

Тогда, если я создаю метод и неправильно ввожу имя класса в Bob:

void Method(Bob parameter){}

Будет ли это просто компилироваться, и параметр получитуниверсальный тип?

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Параметр типа, объявленный для класса, затеняет любой реальный класс, точно так же как локальный класс:

interface HasValue {
    int getValue();
}
class Foo {
}

class Bar implements HasValue {
    private int value;

    public Bar(int v) {
        this.value = v;
    }
    public int getValue() {
        return this.value;
    }
}

class Example<Foo extends HasValue> {
    public static final void main(String[] args) throws Exception {
        Example<Bar> e = new Example<>();
        e.method(new Bar(42));
    }

    public void method(Foo x) {
        System.out.println("x.getValue() is " + x.getValue());
    }
}

Это прекрасно работает, потому что в Example, Foo является параметром типа,не класс Foo.

0 голосов
/ 04 декабря 2018

Чтобы компилятор знал, используется ли класс как универсальный, необходимо указать его следующим образом:

public class MyClass<T> {}

Например, если вы создаете универсальный для списка, давайте предположим следующее:

List<Bob> bobyes = new ArrayList<Bob>();

Итак, теперь у вас есть список обобщенных элементов, содержащих элементы класса типа Bob.Все типы каждого элемента в списке - Боб.

Если вы выполните итерацию по нему, у вас будет:

foreach (Bob bob : bobyes)
   if (bob instanceof Bob)
      true; -- in this case always true;
0 голосов
/ 04 декабря 2018

Любое имя может быть параметром универсального типа.Если вы объявляете параметр универсального типа Bob и используете это имя вместо предполагаемого имени класса Boby, компилятор распознает его как параметр универсального типа.

Кстати, если вы объявите универсальный типпараметр Boby, он будет скрывать имя класса Boby, поэтому запись Boby в любом месте области действия, где определен этот параметр универсального типа (либо внутри всего класса, либо внутри одного метода), будет ссылаться на параметр универсального типане для класса Boby.

class Something<Bob> {
    void Method1(Bob parameter){} // refers to the generic type parameter Bob

    void Method2(Boby parameter){} // refers to the Boby class
}

class Something<Boby> {
    void Method(Boby parameter){} // refers to the generic type parameter Boby,
                                  // hiding the Boby class
}

class Something<T> {
    void Method(Bob parameter){} // compilation error - Bob is an undefined symbol
}

Тем не менее, для того, чтобы сделать ваш код более читабельным, рекомендуется использовать одну букву верхнего регистра в качестве имен параметров типа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...