2016-11-30 2 views
2

Я не понимаю, почему следующий код работает:Должен ли тип T в addToCollection (T [] a, Collection <T> c) быть тем же?

import java.util.ArrayList; 
import java.util.Collection; 

    public class Main { 

     public static void main(String[] args) { 
      Integer[] arr=new Integer[]{1,2,3}; 
      ArrayList<Object> al=new ArrayList<>(); 
      addToCollection(arr, al); 
     } 
     static <T> void addToCollection(T[] a, Collection<T> c) 
     { 
      for(T o:a) 
       c.add(o); 
     } 
    } 

это не должно быть:

...

static <T> void addToCollection(T[] a, Collection<? super T> c) 

...?

Не должен ли быть тип T во время разговора?

Как сказано в комментариях, мой вопрос: «Какой тип выведен для T». Поскольку код работает, я предполагаю, что высший тип в иерархии выведен.

+0

Как и что? – shmosel

+0

Если у вас есть массив 'Bicycle', разве вы не сможете добавить его в коллекцию' Vehicle'? – chrylis

+3

Он спрашивает, почему ему разрешено передавать 'ArrayList ' и' Integer [] '. Вопрос в том, какой тип выводится для 'T', и я считаю, что это' Object', но в настоящее время не имеет конкретной ссылки на JLS. –

ответ

2

Оба arr и al являются подтипами объекта, так что это то, что вы получаете. Если вы измените функцию addToCollection на тип возврата, это произойдет:

public static class Main { 

    public static void main(String[] args) { 
     Integer[] arr=new Integer[]{1,2,3}; 
     ArrayList<Object> al=new ArrayList<>(); 
     Collection<Object> objects = addToCollection(arr, al); // Compiles 
     Collection<Integer> numbers = addToCollection(arr, al); // Doesn't compile 
    } 

    static <T> Collection<T> addToCollection(T[] a, Collection<T> c) 
    { 
     for(T o:a) // Behold the side effect 
      c.add(o); 

     return c; 
    } 
} 
+0

Итак, второй 'addToCollection (arr, al)' возвращает 'Collection ', правильно? – Christian

+0

Да, он не компилируется, потому что тип неверен. Это только для того, чтобы показать это. – Roger

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