有没有比使用通用 WildCard 作为方法参数更好的方法?

Is there a better way than using a generic WildCard as a method parameter?

我需要针对三个不同地图的 getNextId() 方法:

private final Map<Integer, Track> tracks;
private final Map<Integer, Train> trains;

private final Map<Integer, Coach> coaches;

到目前为止,我有三种不同的方法,但这显然是不必要的。如果该方法只需要对上述地图起作用,是否有比使用通用通配符 ? 更好的方法?

public int getNextId(Map<Integer, ?> givenMap) {
            int id = 1;
        for (int key : givenMap.keySet()) {
            if (key > id) break;
            id = key + 1;
        }
        return id;
}

getNextId()方法基本上是获取最小的可用ID >=1。如果存在 trainIDs 1、2、3、4 并且用户删除了 ID 为 2 的列车,则下一个添加的列车将获得 ID 2。

编写一个接口或 class(我们称它为 MyBase),由调用三个 TrackTrainCoach.

继承

然后修改你的方法:

public int getNextId(Map<Integer, ? extends MyBase> givenMap) {
    ...
}

基本上我会建议尽可能精确。如果您知道您的函数仅适用于 classes 的固定集,则您不应该使传递 any class 成为可能 - 这将适用于?-通配符。否则你会得到一些奇怪的运行时错误,因为我可能只是提供一个 HashMap<Integer, MyOwnClass> 而编译器不会抱怨。此外,您不能在 ? 上做很多事情,这将评估为 Object。因此,如果有一天您需要评估地图值,那么您就会遇到一个很大的问题,因为您只会得到 Object。如果您在外部有现有客户,则此时可能无法更改方法签名。所以我强烈建议不要使用 ? 除非你真的想要 "any arbitrary type of map"。

您似乎拥有三种类型,它们都具有某种标识符。所以最好是为它们提取一个接口并在您的实现中使用它:

interface MyInterface { }
class Track : MyInterface { }
class Train : MyInterface { }
class Coach: MyInterface { }

现在很容易定义您的方法:

public int getNextId(Map<Integer, ? extends MyInterface> givenMap) { ... }

除此之外,当您只是对 感兴趣时,我不明白为什么您一开始就使用任何地图。最好只提供 List<Integer> 或类似的。