Почему это должно быть разрешено?

1

Я знаю, что не все WTF созданы равными, но почему это даже будет действительным. Он компилируется и только жалуется, когда вы запускаете его, потому что он не имеет static void main метода static void main, но кроме этого он синтаксически исправляет. Я попытался дать ему main метод, _.java его в файл с именем _.java и он запустился.

class _<_>
{
    <_> _ _(_ _){ return (_)_; }
}

Таким образом, очевидно, что "вещь" внутри class - это метод, который принимает аргумент, имя которого совпадает с его типом и возвращает все, что он получил в качестве аргумента. Очевидно, что (_)_ - это литье. Но я не участвую перед (_ _). Я думаю, что имя метода - _, но что такое <_> _? Если это дженерики, то не должно быть _<_>?

  • 2
    Замените _ на что-то вроде A и посмотрите, имеет ли смысл ...
  • 0
    Да уж. Я пробовал это, до сих пор не получить <_> в начале метода.
Показать ещё 1 комментарий
Теги:
syntax

2 ответа

2

Замените _ чем-то полным, как было предложено. Тогда вы можете увидеть, что <_> _ _(_ _) часть <T> Node foo(Node node). Это действительно имя метода и тип возврата.

class Node<T> {

    <T> Node foo(Node node) {
        return (Node) node;
    }

    public static void main(String[] args) {
        Node<String> a = new Node();
        Node<String> b = new Node();
        a.foo(b);
    }
}
  • 0
    хммм ... так что я думаю, я просто никогда не писал дженерики таким образом. Я бы обычно ставил Node<T> . Ну, это то, что есть.
1

Подход, примененный @ravindrab, является правильным, но результат неверен.

  1. Объявление параметра типа метода <T> (<_>) в исходном исходном коде) затеняет объявление типа класса Node (_); поэтому аргумент имеет тип T, а не тип Node
  2. Параметр типа метода также затеняет параметр типа класса, поэтому, чтобы избежать путаницы, лучше дать ему другое имя, например X

Результат:

class Node<X> {
    <T> T foo(T t) {
        return (T) t;
    }
}

Правила затенения описаны в разделе 6.4.1 JLS. Специфическая применимость к этому случаю:

Объявление d типа с именем n затеняет объявления любых других типов с именем n которые находятся в области видимости в точке, где d встречается во всей области d.

  • 0
    Проще всего проверить это в Eclipse: перейдите к _ внутри приведения (_) и выберите «Открытое объявление» (F3). Курсор перейдет к определению параметра типа; <_> так что приведение к типу параметра этого типа.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню