将原始类型重新编码为泛型

时间:2012-06-07 07:05:20

标签: java model-view-controller oop

我有一些遗留代码,我想升级到泛型:

    /**
     * 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>时,它表示它不是泛型,所以我做错了。你能告诉我如何使我的代码的这部分现代化使用泛型吗?

由于

3 个答案:

答案 0 :(得分:4)

至于places ......

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

public Map<String, Place> places;

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

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

像这样:

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

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

答案 1 :(得分:2)

  

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

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

正确的方法是

public Map<KeyType, Place> places;

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

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

并且可能还有外部呼叫,例如到一个二传手(如果有的话)。

答案 2 :(得分: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是Player和Place对象的类名。