获取类定义中泛型的参数化类型

时间:2019-08-30 18:55:56

标签: java generics

我正在编写一个接受参数化类型的类,并尝试对其进行参数化。

所以我有一个具有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>>();

1 个答案:

答案 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);

尽管似乎我们只将问题移到了另一个地方,但使使用该类变得更加简单,因为使用该方法时无需写下泛型类型参数。

我认为这里有两个概念,必须分开:

  1. 类的类型参数
  2. 该类所基于的类型

唯一未知且必须填写的变量类型是K。当您知道K时,可以从中得出User<K>User始终相同。因此,此类仅应具有一个类型参数:K。这足以定义具体的类。

该类对类型为User<K>的对象进行操作。您尝试通过类型参数来表达它,但这不是泛型的目的。我不知道从K捕获User<K>的方法,我认为这里没有必要。这样只会使定义变得不必要的复杂。