我正在编写一个接受参数化类型的类,并尝试对其进行参数化。
所以我有一个具有ID的User对象。我正在将ID设置为参数化类型。我有一个名为Router
的类,需要提供一个方法T route(List<T>);
,其中T extends User
。
在Router
内,我有一些实用程序方法,需要根据用户内的ID进行分组,该ID也已参数化。因此User
看起来像User<K>
,其中K
是ID的类型。因此,我将在Router中找到一种类似于以下内容的方法:
public T route(List<T> listToRoute) {
Map<K, Double> someUtilityMap = groupValueById(listToRoute);
// apply some logic
return chooseFinalCandidate(someUtilityMap);
}
当前,我有:
public class Router<K, T extends User<K>> {
是否有一种更干净的方法来获取和引用K
中的Router
,而调用者不必在实例化中显式提供它?我可以以某种方式给T
,然后在K
实现中使用Router
吗?
我需要在代码中显式引用K
,所以类似:
Map<K, Double> groupValueById(List<T> routingCandidates) {
我想做的事情是这样的:
new Router<User<Integer>>();
相对于:
new Router<Integer, User<Integer>>();
答案 0 :(得分:0)
我建议您将签名或班级更改为public class Router2<K>
。
目前,我了解到,您有类似
public class Router<K, T extends User<K>> {
Map<K, Double> groupValueById(List<T> routingCandidates) {
return null;
}
}
然后称呼它
List<User<Integer>> list = new ArrayList<>();
Router<Integer, User<Integer>> router = new Router<>();
Map<Integer, Double> map = router.groupValueById(list);
您可以将其更改为
public class Router<K> {
<T extends User<K>> Map<K, Double> groupValueById(List<T> routingCandidates) {
return null;
}
}
并像
那样称呼它List<User<Integer>> list = new ArrayList<>();
Router<Integer> router = new Router<>();
Map<Integer, Double> map = router.groupValueById(list);
尽管似乎我们只将问题移到了另一个地方,但使使用该类变得更加简单,因为使用该方法时无需写下泛型类型参数。
我认为这里有两个概念,必须分开:
唯一未知且必须填写的变量类型是K
。当您知道K
时,可以从中得出User<K>
。 User
始终相同。因此,此类仅应具有一个类型参数:K
。这足以定义具体的类。
该类对类型为User<K>
的对象进行操作。您尝试通过类型参数来表达它,但这不是泛型的目的。我不知道从K
捕获User<K>
的方法,我认为这里没有必要。这样只会使定义变得不必要的复杂。