Спецификация языка Ява для Java, 8 приведен пример вызова метода с аргументом типа в «Примере 4.11-1 Использование такого типа.»:Вопросы, относящиеся к типу параметров в методе Java вызывает
<S> void loop(S s) {
this.<S>loop(s); // <S> is the the type argument for the method call.
}
В этом примере аргумент поставляемого типа имеет смысл, но, по-видимому, аргументы типа для вызовов методов также могут быть избыточными и совершенно бессмысленными, а дженерики не требуют даже участия. Например:
void m() { }
void test() {
m();
this.m();
this.<Integer>m(); // Compiles and runs OK!
this.<String, Byte, StringBuilder, Thread[], Throwable>m(); // Compiles and runs OK!
<Integer>m(); // Won't compile: "illegal start of expression"
}
У меня есть несколько вопросов, возникающих:
Можно ли предложить вескую причину для Java позволяет эти избыточные параметры типа? Признавая, что они не навредят, мне все же кажется, что компилятор может и должен поймать.
Этот код компилируется только при вызове метода с аргументами типа с префиксом «this.». В противном случае вы получите ошибки «незаконного начала выражения». Это ошибка? Не следует использовать какой-либо однозначный метод, который работает с «этим». также работают без «этого».?
(Катализатор этих вопросов Oracle's response на сообщение об ошибке, я создал интересную проблему Java кто-то подняли here на SO.)
UPDATE Сентябрь 18, 2015
- Я поднял bug JDK-8098556 по этой проблеме с Oracle. Вот их ответ:
Это не проблема; ссылки метод проверяются, используя те же правила, что и простые методы - обратите внимание, что для обычных методов, которые вы всегда можете поставить избыточные типовые аргументы:
void m() { }
this.<String>m(); //legal
метод (и конструктор) ссылки просто унаследовать это поведение, как и в 15.13: «» Если ссылочное выражение метода имеет форму ReferenceType :: [TypeArguments] Identifier, потенциально применимыми методами являются методы-члены типа для поиска, имеющие соответствующее имя (заданное идентификатором), доступность, arity (n или n-1) , и аргумент типа arty (полученный из [TypeArguments]), как указано в п. 15.12.2.1. "
- С этого момента nse подтверждает информацию TAsk уже предоставил ниже (включая ссылки на соответствующий раздел JLS), я принял этот ответ.
Не знаю, почему это разрешено, но в Eclipse, вы получите предупреждение «аргументы Неиспользуемого типа для отсутствия универсального метода т() типа теста, оно не должно быть параметрироваться с аргументами», что означает * Дон» сделайте это *. --- 'это. m() 'is * syntactically * valid и имеет значение, если' m' набирается, но ' m()' - это простой недопустимый синтаксис. –
Andreas
см. Http://stackoverflow.com/questions/28014853/what-is-the-point-of-allowing-type-witnesses-on-all-method-calls – ZhongYu
Второй вопрос должен быть из-за некоторых трудностей синтаксического анализа/грамматики. например, 'x < m()' –
ZhongYu