2015-08-16 3 views
0

Я пытаюсь изучить подстановочные знаки в Java. Здесь я пытаюсь изменить метод printCollection, так что он будет принимать только класс, который расширяет AbstractList. Он показывает ошибку в комментарии. Я попытался использовать объекты ArrayList, он отлично работает. Я использую Java 7.ArrayList объектов и абстрактных

import java.util.AbstractList; 
import java.util.ArrayList; 
import java.util.Collection; 
import java.util.List; 
import java.util.Set; 

public class Subtype { 
    void printCollection(Collection<? extends AbstractList<?>> c) { 
     for (Object e : c) { 
      System.out.println(e); 
     } 
    } 

    public static void main(String[] args) { 
     Subtype st= new Subtype(); 
     ArrayList<String> al = new ArrayList<String>(); 
     al.add("a"); 
     al.add("n"); 
     al.add("c"); 
     al.add("f"); 
     al.add("y"); 
     al.add("w"); 
     //The method printCollection(Collection<? extends AbstractList<?>>) in the type Subtype is not applicable for the 
     // arguments (ArrayList<String>) 
     st.printCollection(al); 
    } 

} 
+0

Есть ли конкретная причина, по которой вы хотели бы разрешить списки, расширяющие 'AbstractList', а не все списки, реализующие интерфейс' List' (контракт)? Указав 'AbstractList', вы связываете свой код с конкретной реализацией. Когда это возможно, вы должны кодировать интерфейсы вместо реализаций. –

+0

@MickMnemonic спасибо, я буду помнить об этом. –

ответ

2

Вы запрашиваете коллекцию объектов AbstractList, например список, заполненный AbstractLists. Это действительно то, что вы намеревались?

Одним из способов решения было бы ...

<T extends AbstractList<?>> void printCollection(T c) { 

... таким образом, ваш метод будет принимать только объекты расширения AbstractLists с любым содержанием общего.

Но, как и другие комментаторы, плакаты и писатели (Дж Блох: Эффективное Jave, P134 +) уже и правильно указали, тем лучше стиль будет просто попробовать что-то вроде этого:

void printCollection(AbstractList<?> c) { 
+0

спасибо, что вы правы, но я не могу понять, как это работает –

+0

Прошу прощения, но я не могу повторить итерацию, что требует хороших страниц книги, чтобы объяснить здесь. Я предлагаю ссылаться на некоторые учебники или книги Java Generics. –

+0

Я использовал эту ссылку, чтобы прочитать о подстановочных знаках https://docs.oracle.com/javase/tutorial/extra/generics/wildcards.html –

2

В коде вы предполагаете, параметр должен реализовывать Collection и должен содержать элементов, которые распространяются AbstractList

void printCollection(Collection<? extends AbstractList<?>> c) 

Чтобы получить то, что вы хотите, вы могли бы просто написать это :

void printCollection(AbstractList<?> c) 
+1

Я думаю, что это лучший ответ. Использование ограниченных подстановочных знаков в сигнатуре метода, где это возможно, может дать более гибкий API. – scottb

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