2012-06-07 2 views
0

У меня есть унаследованный код, который я хочу, чтобы обновить дженерик:перекодирования сырых типов дженерик

/** 
    * Places in this World 
    */ 
    public Map places; 

    /** 
    * Players watching this World 
    */ 
    public Collection players; 

    /** 
    * A reference to the Adventure using this World 
    */ 
    public Adventure owner; 

    /** 
    * Create a World. `a' is a reference to the Frame itself. 
    * This reference is used when loading images and sounds. 
    * 
    * @param a An instance of adventure. 
    */ 
    public World(Adventure a) { 
    places = new HashMap(); 
    players = new LinkedList(); 
    owner = a; 
    } 

Моего IDE предупреждает меня, что я не параметризованный переменные places и players, так что я должен добавить дженерик этот код, но как? Когда я добавляю <> или <Place> в объект «places», тогда он говорит, что это не дженерики, поэтому, как бы то ни было, я делаю это неправильно. Не могли бы вы рассказать мне, как модернизировать эту часть моего кода на использование дженериков?

Благодаря

ответ

4

Что касается places ...

Во-первых, добавить типы в places. Предполагая, что каждое значение является Place, и каждая клавиша является String:

public Map<String, Place> places; 

(Вам нужно два типа:. Один для ключей, и один для значений)

Затем, в конструкторе, сделать тоже самое.

Как так:

public World(Adventure a) { 
    places = new HashMap<String, Place>(); 
    ... 
} 

Остальные поля проще; LinkedList и Collection должен требовать только один тип, и если это старый старый код, Adventure (являющийся частью этого кода) не нужен.

+0

Отлично, он работает. Мне не нужно было менять объявление Adventure и следовать вашим советам для других объектов, которые сейчас работают без предупреждения. Благодаря! –

2

Когда я добавляю <> или <Place>places к объекту то он говорит, что это не дженериков

Так как вы не показывают нам точный код, ни точное сообщение об ошибке , можно только догадываться ... Может быть, вы добавили его после places (что является синтаксически неправильным), или вы добавили только один общий тип параметра в Map (которому нужны два ключа и значение)?

Правильный путь

public Map<KeyType, Place> places; 

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

places = new HashMap<KeyType, Place>(); 
... 
public Map<KeyType, Place> getPlaces() ... 

и, возможно, также внешние вызовы, например, для сеттера (если таковой имеется).

1

Я думаю, вы должны добавить тип объектов, которые вы хотите поместить в карте и в коллекции:

public Map<PlaceClass> places; 

public Collection<PlayerClass> players; 

public World(Adventure a) { 
    places = new HashMap<PlaceClass>(); 
    players = new LinkedList<PlayerClass>(); 
    owner = a; 
} 

Где PlaceClass и PlayerClass являются именами классов ваших объектов игрока и места.

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