2013-09-18 2 views
1

Метод подписи выглядит следующим образом:Как мне вызвать метод, который принимает параметр «Collection <? extends T>»?

  public void addThemAll(Collection<? extends T> c) 

, который по существу только добавляет каждый элемент коллекции моей LinkedList. Но я продолжаю пытаться передать этот метод Array или связанный список, и я всегда получаю сообщение об ошибке. Например:

  double[] myarray = new double[]{3.4, 4.5, 8.6}; 
      mylist.addThemAll(myarray); 

Я уверен, что это что-то просто, но я не могу найти пример в Интернете, что просто передает массив/связанный список в метод, как это.

+0

Как вы объявляете о связанном списке? Каков тип, который вы параметризуете для 'T'? – hexafraction

+3

Массив не является коллекцией. –

+0

mylist is a double – user1956609

ответ

4

Ваш код имеет две проблемы:

  1. массив не коллекция. Он не распространяется на коллекцию. Поэтому вы не можете передать его методу, подпись которого задает параметр коллекции.
  2. Вы не определили <T> (или, по крайней мере, вы не показали нам, где вы определяете <T>). Вы можете определить <T> в своем классе или в вашей подписи метода.

Чтобы определить его в своем классе, сделать это следующим образом:

public class MyClass<T> { 
    // contents 
} 

Для определения <T> в методе, сделать это следующим образом:

public <T> void addThemAll(Collection<? extends T> c) { 
    // method logic 
} 
0

за то, что занимаются, это будет работать:

List<Double> myArray = Arrays.asList(3.4, 4.5, 8.6); 
mylist.addThemAll(myarray); 

Причина в том, что вы передаете список (который представляет собой коллекцию). В настоящее время вы проходите в массиве, который не является коллекцией.

0

Чтобы передать массив в коллекции:

Double[] myarray = new Double[]{3.4, 4.5, 8.6}; 
     mylist.addThemAll(Arrays.asList(myarray)); 

, если вы не хотите его как список, но хотите его как LinkedList или т.д.

LinkedList<Double> linkedlist = new LinkedList(Arrays.asList(myarray)); 
mylist.addThemAll(linkedlist); 

, если вы хотите использовать набор или TreeSet

TreeSet <Double> treeset = new TreeSet(linkedlist); 

Разница между множеством и списком является то, что набор не дублируются и не заказывали, и Лис t упорядочен, но содержит дубликаты.

После того, как вы пройдете в свой метод:

public void addThemAll(Collection<? extends T> c) 
if(c instanceof LinkedList){ 
LinkedList a = (LinkedList) c //you can invoke methods from LinkedList 
.... 
} 
+0

Передача массива удвоений в Arrays.asList () приведет к списку размера 1, причем весь массив будет первым элементом. – dnault

+0

Arrays.asList (массив) вернет представление списка массива. Это означает, что в списке будет каждый элемент массива, который находится в том же порядке индекса. Таким образом, список не будет иметь размер 1, но размер 3 в этом случае. Класс-оболочка типа не будет иметь никакого эффекта, поскольку список является общим. – JungJoo

+0

@ dnault, вы на самом деле правы, я использовал Double в своем тестовом классе. Используя массив примитивных типов, он вызывает некоторую ошибку. – JungJoo

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