Каково различие между ограниченным подстановочным знаком и параметрами типа?

diff.rb - то, что Вы хотите, который доступен в http://users.cybercity.dk/~dsl8950/ruby/diff.html через интернет-архив:

http://web.archive.org/web/20140421214841/http://users.cybercity.dk:80/~dsl8950/ruby/diff.html

37
задан Joachim Sauer 20 February 2013 в 12:35
поделиться

2 ответа

В данном конкретном случае нет. однако второй вариант является более гибким, поскольку он позволяет вам возвращать коллекцию, содержащую элементы другого типа (даже если это также будет число), чем тип, содержащийся в параметре коллекции.

Конкретный пример:

Collection<? extends Number> getRoot(Class<? extends Number> number){ 
    ArrayList<Integer> result=new ArrayList<Integer>();
    result.add(java.util.Math.round(number); 
    return result) 
}
]
-3
ответ дан 27 November 2019 в 05:01
поделиться

Они предоставляют разные интерфейсы и контракт для метода.

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

Collection<Integer> c1 = getThatCollection(Integer.class);
Collection<Double> c2 = getThatCollection(Double.class);

Второе объявление не объявляет отношения между возвращенным аргументом типа Collection и классом аргументов. Компилятор предполагает, что они не связаны между собой, поэтому клиенту придется использовать возвращаемый тип как Collection , независимо от аргумента:

// Invalid statements
Collection<Integer> c1 = getThatCollection(Integer.class);   // invalid
Collection<Double> c2 = getThatCollection(Double.class);   // invalid
Collection<Number> cN = getThatCollection(Number.class);   // invalid

// Valid statements
Collection<? extends Number> c3 = getThatCollection(Integer.class);  // valid
Collection<? extends Number> c4 = getThatCollection(Double.class);  // valid
Collection<? extends Number> cNC = getThatCollection(Number.class);  // valid

Рекомендация

Если действительно существует связь между типом между аргументом возвращаемого типа и переданным аргументом, гораздо лучше использовать первое объявление. Код клиента более чистый, как указано выше.

Если отношения не существует, то все же лучше избегать второго объявления. Наличие возвращаемого типа с ограниченным подстановочным знаком заставляет клиента использовать подстановочные знаки повсюду, поэтому клиентский код становится беспорядочным и нечитаемым. Джошуа Блох подчеркивает, что вам следует избегать ограниченных подстановочных знаков в возвращаемых типах (слайд 23). Хотя ограниченные символы подстановки в возвращаемых типах могут быть полезны в некоторых случаях, уродство результирующего кода должно, IMHO, перевесить преимущество.

// Invalid statements
Collection<Integer> c1 = getThatCollection(Integer.class);   // invalid
Collection<Double> c2 = getThatCollection(Double.class);   // invalid
Collection<Number> cN = getThatCollection(Number.class);   // invalid

// Valid statements
Collection<? extends Number> c3 = getThatCollection(Integer.class);  // valid
Collection<? extends Number> c4 = getThatCollection(Double.class);  // valid
Collection<? extends Number> cNC = getThatCollection(Number.class);  // valid

Рекомендация

Если действительно существует связь между типом между аргументом возвращаемого типа и переданным аргументом, гораздо лучше использовать первое объявление. Код клиента более чистый, как указано выше.

Если отношения не существует, то все же лучше избегать второго объявления. Наличие возвращаемого типа с ограниченным подстановочным знаком заставляет клиента использовать подстановочные знаки повсюду, поэтому клиентский код становится беспорядочным и нечитаемым. Джошуа Блох подчеркивает, что вам следует избегать ограниченных подстановочных знаков в возвращаемых типах (слайд 23). Хотя ограниченные символы подстановки в возвращаемых типах могут быть полезны в некоторых случаях, уродство результирующего кода должно, IMHO, перевесить преимущество.

// Invalid statements
Collection<Integer> c1 = getThatCollection(Integer.class);   // invalid
Collection<Double> c2 = getThatCollection(Double.class);   // invalid
Collection<Number> cN = getThatCollection(Number.class);   // invalid

// Valid statements
Collection<? extends Number> c3 = getThatCollection(Integer.class);  // valid
Collection<? extends Number> c4 = getThatCollection(Double.class);  // valid
Collection<? extends Number> cNC = getThatCollection(Number.class);  // valid

Рекомендация

Если действительно существует связь между типом между аргументом возвращаемого типа и переданным аргументом, гораздо лучше использовать первое объявление. Код клиента более чистый, как указано выше.

Если отношения не существует, то все же лучше избегать второго объявления. Наличие возвращаемого типа с ограниченным подстановочным знаком заставляет клиента использовать подстановочные знаки повсюду, поэтому клиентский код становится беспорядочным и нечитаемым. Джошуа Блох подчеркивает, что вам следует избегать ограниченных подстановочных знаков в возвращаемых типах (слайд 23). Хотя ограниченные символы подстановки в возвращаемых типах могут быть полезны в некоторых случаях, уродство результирующего кода должно, IMHO, перевесить преимущество.

Код клиента более чистый, как указано выше.

Если отношения не существует, то все же лучше избегать второго объявления. Наличие возвращаемого типа с ограниченным подстановочным знаком заставляет клиента использовать подстановочные знаки повсюду, поэтому клиентский код становится беспорядочным и нечитаемым. Джошуа Блох подчеркивает, что вам следует избегать ограниченных подстановочных знаков в возвращаемых типах (слайд 23). Хотя ограниченные символы подстановки в возвращаемых типах могут быть полезны в некоторых случаях, уродство результирующего кода должно, IMHO, перевесить преимущество.

Код клиента более чистый, как указано выше.

Если отношения не существует, то все же лучше избегать второго объявления. Наличие возвращаемого типа с ограниченным подстановочным знаком заставляет клиента использовать подстановочные знаки повсюду, поэтому клиентский код становится беспорядочным и нечитаемым. Джошуа Блох подчеркивает, что вам следует избегать ограниченных подстановочных знаков в возвращаемых типах (слайд 23). Хотя ограниченные символы подстановки в возвращаемых типах могут быть полезны в некоторых случаях, уродство результирующего кода должно, IMHO, перевесить преимущество.

Джошуа Блох подчеркивает, что вам следует избегать ограниченных подстановочных знаков в возвращаемых типах (слайд 23). Хотя ограниченные символы подстановки в возвращаемых типах могут быть полезны в некоторых случаях, уродство результирующего кода должно, IMHO, перевесить преимущество.

Джошуа Блох подчеркивает, что вам следует избегать ограниченных подстановочных знаков в возвращаемых типах (слайд 23). Хотя ограниченные символы подстановки в возвращаемых типах могут быть полезны в некоторых случаях, уродство результирующего кода должно, IMHO, перевесить преимущество.

36
ответ дан 27 November 2019 в 05:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: