Почему параметр типа требуется перед возвращаемым типом для статических обобщенных методов - PullRequest
0 голосов
/ 10 сентября 2018

Следующий метод noGood дает ошибку компиляции, поскольку он пропускает параметр формального типа непосредственно перед типом возврата T.

public static T noGood(T t) {
  return t;
}

Может кто-нибудь помочь мне понять, почему статический универсальный метод должен иметь параметр типа перед возвращаемым типом? Разве это не требуется для нестатического метода?

Ответы [ 4 ]

0 голосов
/ 10 сентября 2018

Прежде всего, это довольно стандартно для языков.Даже в C ++:

template <class myType>
myType GetMax (myType a, myType b) {
    return (a>b?a:b);
}

Вы объявляете параметр типа над обобщенной функцией.

Когда он является функцией-членом класса, он имеет доступ к параметрам типа класса.Когда он статичен, это не так, поэтому вам нужно объявить их явно.

0 голосов
/ 10 сентября 2018

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

static методы, с другой стороны, не принадлежат экземпляру - они принадлежат классу. Поскольку нет экземпляра для получения информации о типе, он должен быть указан для самого метода.

0 голосов
/ 10 сентября 2018

Когда вы используете generic, вам нужно объявить их, используя <> нотацию

  1. В классе

    public class Foo<T, U, V>{
    
    }
    
  2. В методе перед типом возврата

    public static <T, U extends Number, V> T foo(T t) {
        U u = ..;
        ...
    }
    
    public static <T> int foo(T t) {
        ...
    }
    
0 голосов
/ 10 сентября 2018

T не определено. Порядок модификаторов и тип возвращаемого значения остаются неизменными.

public static <T> T noGood(T t) {
    return t;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...