При изучении дженериков я заметил разницу в синтаксисе ввода типа между общие методы и общие типы (класс или интерфейс), которые меня смутили.
Синтаксис для общего метода:
<T> void doStuff(T t) {
// Do stuff with T
}
Документы говорят
Синтаксис для общего метода включает параметр типа, внутренние угловые скобки и появляется перед возвратом метода метода
Синтаксис для общего типа
class Stuff<T> {
// Do stuff with T
T t;
}
Документы говорят
Раздел параметров типа, ограниченный угловыми скобками (< > ), , следует за именем класса. Он задает параметры типа
Ибо он не указывает, почему он должен прибыть до или после.
Чтобы быть совместимыми друг с другом, я ожидал, что синтаксис метода будет
void doStuff<T>(T t) {}
или синтаксис типа (для класса) как class <T>Stuff {}
, но это, очевидно, не так.
Почему это нужно вводить раньше, а другое после?
Я использовал generics в основном в форме List<String>
и утверждал, что <String>List
может выглядеть странно, но это субъективный аргумент, кроме того, для методов это похоже на это. Вы можете вызвать doStuff
как
this.<String>doStuff("a string");
В поисках технического объяснения я подумал, что, возможно, перед тем, как указать тип возврата, должен быть введен метод <T>
для метода, поскольку T
может быть типом возвращаемого значения, и, возможно, компилятор не может так заглядывать, звучало нечетно, потому что компиляторы умны.
Я полагаю, что объяснение этому объясняется не только тем, что "разработчики языка просто сделали это именно так", но я не смог его найти.