【问题标题】:Inferring a generic type from a generic type in Java (compile time error)从 Java 中的泛型类型推断泛型类型(编译时错误)
【发布时间】:2015-06-19 08:43:46
【问题描述】:

我有一个带有以下泛型类型签名的静态函数T

public static<T> List<T> sortMap(Map<T, Comparable> map)

它应该返回具有某些属性的映射键列表。

现在我想传递一个 S 类型的通用 HashMap

Map<S,Double> map

在泛型类中调用静态函数,该类将映射作为成员变量。

我在下面列出了一个最小的代码示例。

但是,我收到一条错误消息(ST 都是 T,但在我的代码的不同范围内,即 T#1 = TT#2= S):

  required: Map<T#1,Comparable>
  found: Map<T#2,Double>
  reason: cannot infer type-variable(s) T#1
  (argument mismatch; Map<T#2,Double> cannot be converted to Map<T#1,Comparable>)

如何解决这个问题?我很惊讶 Java 不允许从泛型类型推断泛型类型。可以使用 Java 中的哪种结构来处理这种更抽象的代码推理?

代码

public class ExampleClass<T> {
    Map<T, Double> map;
    public ExampleClass () {
        this.map = new HashMap();
    }
    //the following line produces the mentioned error
    List<T> sortedMapKeys = UtilityMethods.sortMap(map);
}

public class UtilityMethods {
     public static<T> List<T> sortMap(Map<T, Comparable> map) {
        // sort the map in some way and return the list
     }
}

【问题讨论】:

  • 请向观众展示课程代码。
  • static 方法不能访问成员变量;你用的是什么版本的java?
  • 我认为您必须添加更多代码才能让我们理解问题。
  • 顺便说一句,您不能使用Map&lt;S,Double&gt; 传递给需要Map&lt;T, Comparable&gt; 的方法。 DoubleComparable 是具有不同继承层次结构的不同类型。

标签: java generics types


【解决方案1】:

不是TS 的问题,而是ComparableDouble 的问题。

错误的原因是Map&lt;T, Double&gt; is not a Map&lt;T, Comparable&gt;

您必须稍微扩大第二个类型参数的范围。比如:

public static <T, S extends Comparable<S>> List<T> function(Map<T, S> map) {
    //implementation
}

然后,您将能够调用该方法:

Map<S, Double> map = new HashMap<S, Double>();
function(map);

【讨论】:

  • 这叫variance
  • 谢谢!我被专注于泛型类型的编译器消息误导了。另外,我认为编译器会理解DoubleComparable,并且接口的处理方式与泛型的类继承不同。我仍然认为在泛型中使用extends 关键字来描述我期望类型Sthat implements 和接口的Java 逻辑有点偏离。我在这里想念什么吗?用泛型扩展和接口有意义吗?
  • 是的,泛型中的extends 用于类和接口。
  • 为了获得最佳效果,请使用S extends Comparable&lt;? super S&gt;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-21
  • 2018-04-01
  • 1970-01-01
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多