class GenMethDemo {
static <T, V extends T> boolean isIn(T x, V[] y) {
for (int i = 0; i < y.length; i++)
if (x.equals(y[i]))
return true;
return false;
}
/*when compiled in java 7 it producing an error and compiling in java 8 without error */
public static void main(String args[]) {
Integer nums[] = {1, 2, 3, 4, 5};
String s[] = {"one", "two", "three"};
System.out.println(isIn("fs", nums));
/*
when compiled in java 7 it producing an error and compiling in java 8 without error */
}
}
ответ
Это связано с улучшением вывода на основе обобщенного целевого типа в Java 8. На самом деле я ответил на вопрос, похожий на эту последнюю неделю. Java 8 call to generic method is ambiguous
Первый ответ на вопрос Java 8: Reference to [method] is ambiguous также очень хорош.
Java 8 может вывести тип аргументов, переданных универсальному методу. Так как @Thomas сказал в своем комментарии, тип T
считается Object
, а V
является объектом, который расширяет Object
, поэтому Integer
. В Java 7 это просто вызовет ошибку, так как Integer
явно не распространяется String
.
В Java 7 вывод типа будет видеть T = String
и V = Integer
, который не удовлетворит V extends T
.
Однако JLS для Java 8 утверждает, что это будет работать:
List<Number> ln = Arrays.asList(1, 2.0);
Таким образом, в вашем случае это будет решен до T = V = Object
.
- 1. Объявить экземпляр типового типа динамически
- 2. Запрещается перегрузка параметров типового типа?
- 3. IL Вызывает генератор типового типа?
- 4. Доступ к членам типового типа
- 5. Несоответствие типа декларации типа
- 6. Несоответствие типа
- 7. Создать шаблон типового типа из строки
- 8. Регистрация другого типового типа при сканировании
- 9. Определение параметра ограниченного типового типа в C#
- 10. Тестирование типового параметра типа для интерфейса
- 11. Возможны ли псевдонимы типового типа в TypeScript?
- 12. Использование параметра типового типа в качестве параметра
- 13. HashMap HashMap сериализации типового типа в Java
- 14. Вывод типового типа Scala несовместим с ClassTag
- 15. Вложенные параметры типового типа - как его обрабатывать?
- 16. Добавление настраиваемого шаблона типового типа в CodeRush
- 17. Почему объявление массива типового типа корректно?
- 18. Сохранение типового параметра типа для дальнейшего использования
- 19. Псевдонимы типового типа в Swift 3?
- 20. Создайте экземпляр типового типа в Scala?
- 21. Тип типового типа приводит к ошибке
- 22. Невозможно вызвать инициализатор для подкласса типового типа
- 23. Установка параметра типового типа из параметра метода
- 24. Построение параметра типового типа в Haxe
- 25. Ссылка на параметр типового типа, затененный элементом абстрактного типа
- 26. Как ссылаться на параметр типового типа параметра общего типа?
- 27. java.lang.IllegalArgumentException: несоответствие типа аргумента
- 28. Несоответствие типа Monad
- 29. Scala Тип Несоответствие типа
- 30. Несоответствие типа VBA
Измените свой вопрос, чтобы показать * текст *, описывающий проблему. В частности, какую ошибку вы получаете в Java 7? –
'isIn (" fs ", nums)' не должно работать, поскольку в этом случае 'T' будет' String', а 'V' будет' Integer', который не расширяет 'String'. Однако вывод типа Java 8 может быть более мягким, поскольку он пытается найти совпадение, которое будет «T = Object» и «V = Object». – Thomas