2012-08-13 5 views
0

Я попытался строку ниже:Ошибка в Java дженериков

HashMap <Temp,<? extends Action> > p= new HashMap<Temp, <? extends Action>>() 

Eclispe дает мне ошибку

Несколько маркеров на этой линии - ошибка синтаксиса на маркер «» Тип ожидается после этот маркер - Синтаксическая ошибка на маркер "" Тип ожидается после этот маркер

Любые причины, по которым я получаю эту ошибку и как ее удалить?

+0

Пожалуйста, переформатируйте. Он не отображается должным образом. – jn1kk

+0

Не используйте '<>' around'? расширяет действие' ... и вы будете ближе к тому, чтобы быть правым. –

+1

Ошибка не в Java Generics. –

ответ

-4

Программа для интерфейсов!

Map<Temp, ? extends Action> p = new HashMap<Temp, ? extends Action>(); 

Его лучшая практика.

Я заметил, что, возможно, на это не ответил правильно. Проблема подробно объясняется here. Что будет работать для вас, возможно,

Map<Temp, ? super Action> p = new HashMap<Temp, Action>(); 

Надеюсь, что это поможет.

Третье изменение, я новичок в написании комментария так, обратите внимание, уверен, что этот процесс, так или иначе, вот пример:

public void doSomething() 
{ 
    Map<A, ? super A> p = new HashMap<A, A>(); 

    A a1 = new A(); 
    A a2 = new A(); 

    // AS A CONSUMER 
    // Not a problem because at runtime we'll know we can accept A. 
    p.put(a1, new B()); 
    p.put(a2, new C()); 

    // AS A PRODUCER 
    // what do I cast to? No way of knowing if its B or C. 
    for (Object a : p.values()) 
    { 
    } 

    // Same deal as above is it B or C? 
    p.get(a1); 
} 

class A{} 

class B extends A {} 

class C extends B {} 
+6

Вы не можете создать экземпляр типа с аргументом подстановки. – Jeffrey

+0

Почему '? супер действие'? Разве это не отличается от переменной, которую пытается назначить ОП? –

+0

В основном это сводится к тому, что вы хотите сделать с картой. Если вы хотите добавить элементы (список является производителем) к нему, то во время выполнения с вы не можете во время выполнения знать определенный класс, который вы добавляете, поэтому вы не можете добавить. Если вы хотите прочитать из списка (список является потребителем), гарантирует, что действие может быть разрешено только в списке. Более подробное объяснение доступно в ссылке, которую я предоставил ранее ... – ramsinb

4

Имейте это:

HashMap <Temp, ? extends Action > p= new HashMap<Temp, *>(); 

Вам нужно два типа для карты. Введите ключ и тип для значения. Вы не можете окружать второй (значение) тип < & >, потому что это просто запрещено.

Я также рекомендую программирование на интерфейс, обратите внимание на объявленный тип является интерфейсом:

Map<Temp, ? extends Action > p = new HashMap<Temp, ? extends Action>(); 

EDIT

Как отмечалось, вы не можете создать экземпляр переменной с шаблонного шаблонного типа. Пожалуйста, измените * на тот тип, который вам нужен.

+0

+1 для программирования на интерфейс –

+3

Вы не можете создать экземпляр типа с аргументом подстановки. – Jeffrey

2

будет скомпилирован:

Map<Temp, ? extends Action> p = new HashMap<Temp, Action>(); 

Или с Java 7:

Map<Temp, ? extends Action> p = new HashMap<>(); 

Вы имели дополнительный < и > в типа значения PARAMET er, вызывая синтаксическую ошибку. Прошлое, you can't instantiate a generic type using a wildcard as a type parameter.

Вы также заметите, что я изменил переменную Map вместо HashMap - это хорошая практика, чтобы program to interfaces вместо реализации, как winged's answer упоминает.

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