Причина, по которой этот компилятор состоит в том, что Java выведет наиболее специфичный супертип переданных аргументов, в этом случае Object
Serializable & Comparable<? extends Serializable & Comparable<? extends Comparable<?>>>
, после того как 1
помечен в поле Integer
и "1"
как String
.
Без генерик:
private static void method(Number arg1, Number arg2) {
Даже без дженериков вы можете передать Integer
и Double
.
Только если тип, о котором идет речь, final
, вы можете сделать это без дженериков:
private static void method(String arg1, String arg2) {
// Yes, they're both Strings, guaranteed.
Существует один краевой случай с дженериками, о котором я могу думать, чтобы убедиться, что они являются точным типом. Если у вас есть класс final
, и вы помещаете верхнюю границу, вы можете ограничить его тем же классом.
public <T extends MyFinalClass> void method(T arg1, T arg2) {
// Yes, they're both MyFinalClasses
}
Но тогда вы могли бы сделать то же самое без дженериков.
public void method(MyFinalClass arg1, MyFinalClass arg2) {
// Yes, they're both MyFinalClasses
}