Я знаю, что не все WTF созданы равными, но почему это даже будет действительным. Он компилируется и только жалуется, когда вы запускаете его, потому что он не имеет static void main
метода static void main
, но кроме этого он синтаксически исправляет. Я попытался дать ему main
метод, _.java
его в файл с именем _.java
и он запустился.
class _<_>
{
<_> _ _(_ _){ return (_)_; }
}
Таким образом, очевидно, что "вещь" внутри class
- это метод, который принимает аргумент, имя которого совпадает с его типом и возвращает все, что он получил в качестве аргумента. Очевидно, что (_)_
- это литье. Но я не участвую перед (_ _)
. Я думаю, что имя метода - _
, но что такое <_> _
? Если это дженерики, то не должно быть _<_>
?
Замените _ чем-то полным, как было предложено. Тогда вы можете увидеть, что <_> _ _(_ _)
часть <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);
}
}
Node<T>
. Ну, это то, что есть.
Подход, примененный @ravindrab, является правильным, но результат неверен.
<T>
(<_>
) в исходном исходном коде) затеняет объявление типа класса Node
(_
); поэтому аргумент имеет тип T
, а не тип Node
X
Результат:
class Node<X> {
<T> T foo(T t) {
return (T) t;
}
}
Правила затенения описаны в разделе 6.4.1 JLS. Специфическая применимость к этому случаю:
Объявление
d
типа с именемn
затеняет объявления любых других типов с именемn
которые находятся в области видимости в точке, гдеd
встречается во всей областиd
.
_
внутри приведения (_)
и выберите «Открытое объявление» (F3). Курсор перейдет к определению параметра типа; <_>
так что приведение к типу параметра этого типа.
_
на что-то вродеA
и посмотрите, имеет ли смысл ...<_>
в начале метода.