Есть ли какие-либо преимущества использования шаблонов типа подстановки в классе Bar по сравнению с их полным пропуском?
Bar
public class Foo<T> {} public interface Bar { public void addFoo(Foo<?> foo); public Foo<?> getFoo(String name); }
Есть несколько преимуществ.
Они дают больше безопасности типа. Например, рассмотрим, если Foo было List вместо этого. Если бы вы использовали List вместо List<?>, вы могли бы сделать это:
Foo
List
List<?>
myBar.getFoo("numbers").add("some string");
, даже если список был только , предполагается , чтобы содержать Number с. Если вы вернули List<?>, то вы не сможете добавить к нему что-нибудь (кроме null), поскольку тип списка неизвестен.
Number
null