2016-03-23 7 views
0
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 */ 
    } 
} 
+3

Измените свой вопрос, чтобы показать * текст *, описывающий проблему. В частности, какую ошибку вы получаете в Java 7? –

+0

'isIn (" fs ", nums)' не должно работать, поскольку в этом случае 'T' будет' String', а 'V' будет' Integer', который не расширяет 'String'. Однако вывод типа Java 8 может быть более мягким, поскольку он пытается найти совпадение, которое будет «T = Object» и «V = Object». – Thomas

ответ

1

Это связано с улучшением вывода на основе обобщенного целевого типа в 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.

0

В Java 7 вывод типа будет видеть T = String и V = Integer, который не удовлетворит V extends T.

Однако JLS для Java 8 утверждает, что это будет работать:

List<Number> ln = Arrays.asList(1, 2.0); 

Таким образом, в вашем случае это будет решен до T = V = Object.

Смежные вопросы