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 警告我没有对变量进行参数化placesplayers所以我应该在这段代码中添加泛型,但是如何?当我向“places”对象添加<><Place>时,它说它不是泛型,所以我这样做结果是错误的。你能告诉我如何将这部分代码现代化为使用泛型吗?

谢谢

4

3 回答 3

4

至于places...

首先,将类型添加到places. 假设每个值是 a Place,并且每个键是 a String

public Map<String, Place> places;

(您需要两种类型:一种用于键,一种用于值。)

然后,在你的构造函数中,做同样的事情。

像这样:

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

其他字段更简单;LinkedList并且Collection应该只需要一种类型,如果这是旧代码,Adventure(作为该代码的一部分)将不需要任何类型。

于 2012-06-07T07:13:02.283 回答
2

当我添加<>或对象时<Place>places它说它不是泛型

由于您没有向我们展示确切的代码,也没有确切的错误消息,因此只能猜测......也许您在之后添加了它places(这在语法上不正确),或者您只添加了一个泛型类型参数Map(需要两个:键和值)?

正确的方法是

public Map<KeyType, Place> places;

whereKeyType代表您希望使用的密钥的类型。更改此声明后,您还需要更新对地图类型的所有其他引用,例如

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

并且可能还有外部调用,例如对 setter 的调用(如果有的话)。

于 2012-06-07T07:09:03.893 回答
1

我认为您必须添加要放入 Map 和 Collection 中的对象的类型:

public Map<PlaceClass> places;

public Collection<PlayerClass> players;

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

其中 PlaceClass 和 PlayerClass 是 Player 和 Place 对象的类名。

于 2012-06-07T07:10:35.877 回答