【问题标题】:Generics issue - inferred type does not conform to declared bound(s)泛型问题 - 推断类型不符合声明的界限
【发布时间】:2012-04-03 15:37:44
【问题描述】:

我们目前有一个类不能用 openjdk 6 编译。以下缩短的类重现了这个错误:

public class Copy implements ICopy {        
    public <A,B extends List<A>,C extends Map<A,B>> A method(A a, B b) {
        A something = null;
        return something;
    }

    @Override
    public <A,B extends List<A>> A method2(A a, B b) {
        return method(a,b);
    }    
}

界面很简单,就是显示,不能更改method2的签名:

public interface ICopy {    
    public <A,B extends List<A>> A method2(A a, B b);
}

它可以使用 oracles java 版本和 openjdk 7 进行编译 - 但使用 openjdk 6 会失败,不幸的是,我们必须使用该版本来编译(原始)代码。

错误信息是

Copy.java:15: invalid inferred types for C; inferred type does not conform to declared bound(s)
inferred: java.util.Map<A,B>
bound(s): java.util.Map<A,B>
                return method(a,b);
                             ^

我所需要的只是一些想法,如何更改method2 的实现以便它能够编译。我什至不会关心编译器警告...

【问题讨论】:

  • 看起来像一个错误。 Eclipse 编译器和 Sun 的编译器对此只字未提。
  • @GuillaumePolet - 一个错误或对该 java 版本的泛型类型的过度严格处理。而且,是的,eclipse 不会抱怨(这使得重现这个杀死构建的讨厌错误变得相当复杂)。

标签: java generics


【解决方案1】:

我会尝试明确指定边界,如下所示:

return this.<A,B,Map<A,B>>method(a,b);

但是,更一般地说,我根本不认为需要类型参数Cmethod 的参数或其返回类型都没有引用 C,所以如果您可以更改 method 的签名,我将完全省略该类型参数。

【讨论】:

  • 啊,对不起,这真的是一个小样本类,只关注错误。 real 方法使用所有类型参数。
猜你喜欢
  • 2015-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-18
相关资源
最近更新 更多