有没有比使用通用 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),由调用三个 Track
、Train
和 Coach
.
继承
然后修改你的方法:
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>
或类似的。
我需要针对三个不同地图的 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),由调用三个 Track
、Train
和 Coach
.
然后修改你的方法:
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>
或类似的。