2012-04-26 3 views
1

Я объект определяется следующим образом:Generics Wildcards Правильное использование

protected Map<String, ? extends List<? extends LightGeometry>> geoms=new HashMap<String,List<LightGeometry>>(); 

я пытаюсь вставить в объект, который выглядит соответствует подстановочный

ArrayList<LightGeometry> points=new ArrayList<LightGeometry>(); 
points.add((LightGeometry)new LightPoint(pt)); 
geoms.put("point", points); 

Компилятор выдает ошибку, которая говорит:

метод put(String, capture#18-of ? extends List<? extends LightGeometry>) в типе Map<String,capture#18-of ? extends List<? extends LightGeometry>> не применяется для аргументов (String, ArrayList<LightGeometry>)

Что мне не хватает?

EDIT: Почему я использую подстановочные с общими типами Это в основном сводится к возможности назначить список (который я получаю через службу) к в geoms объект, который находится в другом классе, без чтобы просеять список в бросок.

public void onSuccess(Map<String, ArrayList<LightPolygon>> result) { 
    // TODO Auto-generated method stub 
    GWT.log("" + result.size()); 
    Log.debug("" + result.size()); 
    long startTime = System.currentTimeMillis(); 
    if (overlay != null) { 
     overlay.setData(result); 
     overlay.update(); 
     Log.debug("time to add features: " 
       + (System.currentTimeMillis() - startTime)); 
    } 
} 

Если бы я был сделать geoms переменной а Map<String, List<LightGeometry>> затем я получаю сообщение об ошибке броска, который говорит, что я не могу назначить Map<String,ArrayList<LightPolygon>> к «Карта>`

+0

Я хочу, чтобы иметь возможность вставлять значение без использования отливки – giscope

ответ

7

Общий подстановочные не означает, что " Все, что расширяет список «Это означает« Некоторые конкретные вещи, которые расширяют список, но я не знаю, что это такое ».

Поэтому незаконно добавлять что-либо в коллекцию, потому что вы не знаете, что это такое! Это может быть карта LinkedLists, и здесь вы помещаете в нее ArrayList, что заставит кого-то другого получить исключение класса, когда они предполагают, что это LinkedList.

Если вы хотите, чтобы Карта содержала список любого типа, просто объявите ее как карту списков, а не карту? расширяет список.

-

Т.Л., д-р - это то, что вы хотите без маски. Подстановочные знаки обычно используются для указания сигнатур методов, где не имеет значения, знаете ли вы, какие типы. Если вам нужна коллекция, содержащая подклассы, вы просто указываете супертип.

пример:

Map<String, List<Number>> map = new HashMap<String,List<Number>>(); 

List<Number> integers =new ArrayList<Number>(); 
integers.add(Integer.valueOf(1)); 
map.put("integers", integers); 

List<Number> floats = new LinkedList<Number>(); 
floats.add(Float.valueOf(5.2f)); 
map.put("floats", floats); 

Нет отливка!

+1

Java-дженерики не ковариантны, он по своей сути не является типичным. Компилятор, заставляющий вас сделать актерский состав как способ заставить вас сказать: «Я знаю, что эта коллекция больше не гарантируется для типов компилятором». Если вы не хотите делать броски, вы должны объявить свои списки как списки знаменателя. – Affe

+0

Удивительный мужчина .. спасибо кучу! – giscope

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

  • Нет связанных вопросов^_^