Что означает возвращаемый тип S? - PullRequest
2 голосов
/ 27 ноября 2011
public <S extends CharSequence> S foo(S s){
    return null;
}

Я нашел этот метод в одном из вопросов OCJP.Но мне трудно понять, что именно означает тип возврата <S extends CharSequence> S.Может ли кто-нибудь, имеющий знания по Java, объяснить мне, что это значит?

Ответы [ 5 ]

2 голосов
/ 27 ноября 2011

Определение <S extends CharSequence> означает, что S - это тип, который расширяет или реализует CharSequence.

Обратите внимание на наличие S до foo и после него.Это означает, что foo возвращает тип, который расширяет или реализует CharSequence и принимает аргумент того же типа.

1 голос
/ 27 ноября 2011

Я имею в виду, что метод foo принимает CharSequence (или его подкласс или реализующий класс) и в качестве параметра и возвращает тип тот же в качестве возвращаемого значения.

Например, вы можете вызватьметод, подобный этому

CharSequence s = ...
CharSequence result = foo(s);

или

String s = ...
String result = foo(s);

или

StringBuffer s = ...
StringBuffer result = foo(s);

Однако он не позволяет использовать несовпадающие типы возвращаемых данных и параметров.Это не нормально:

String s = ...
StringBuffer result = foo(s);

или

StringBuffer s = ...
String result = foo(s);
0 голосов
/ 27 ноября 2011

<S extends CharSequence> не является частью типа возврата.Он вводит параметр типа в ваш общий метод foo.Здесь S вводится как параметр типа (верхний), ограниченный CharSequence.foo принимает параметр типа S и возвращает то же самое.

0 голосов
/ 27 ноября 2011

В строке написано: Метод foo принимает в качестве параметра любой объект типа S и возвращает объект типа S, если S extends CharSequence. Если вы возьмете, например, StringBuilder (extends CharSequence) и поместите его в этом контексте, это даст следующее:

public StringBuilder foo (StringBuilder s) 
0 голосов
/ 27 ноября 2011

S foo(S s) означает, что метод foo принимает параметр типа S и возвращает S.

. Также метод foo определяет, какой тип можно использоватьдля: S (ваш шаблонный результат) является подклассом CharSequence.

Например, вы можете вызвать его, используя:

foo("example")

И это вернет строку (этодопустимый, потому что String является подклассом CharSequence.

И эта конкретная реализация возвращает ноль во всех случаях.

...