繁体   English   中英

Java泛型中的绑定不匹配警告

[英]Bound mismatch warning in java generics

请看下面的代码清单:

package com.test;

class XParam implements Comparable<XParam>{

    @Override
    public int compareTo(XParam o) {
        // TODO Auto-generated method stub
        return 0;
    }
}

public class Main {

    public static void main(String[] args) {

        Comparable<XParam> param = new XParam() ;

        SomeClass object = new SomeClass() ;
        object.setData( param );

    }
}

现在,

object.setData(param); //以上代码清单中main方法中的第三条语句

如果我使带有正式类型参数的SomeClass泛型,编译效果很好

<T extends Comparable<T>>

如下所示 :-

class SomeClass<T extends Comparable<T>>{

    public void setData(T data) {
    }
}

但是, object.setData(param); 在Eclipse中给出以下编译时错误:-

Bound mismatch: The generic method setData(T) of type SomeClass is not applicable for the 
 arguments (Comparable<XParam>). The inferred type Comparable<XParam> is not a valid 
 substitute for the bounded parameter <T extends Comparable<T>>

如果我在方法级别应用相同的形式类型参数,而不是在类级别添加它,如下所示:

class SomeClass{

    public <T extends Comparable<T>>void setData(T data) {
    }
}

任何理解该概念的良好解释/参考都将受到高度赞赏。

谢谢。

我认为唯一一种原因是绑定不匹配,而另一种则不是,这似乎不是因为您在参数化SomeClass的声明而使用了原始类型。 如果使用原始类型,则编译器不会打扰任何常规检查,因此您不会有任何抱怨。

我认为,如果您尝试使用Comparable<XParam>通用化您的类,则会收到与尝试以不正确的界限调用通用方法时得到的相同错误。


对于通用方法,该错误是有道理的。

如果边界是T extends Comparable<T> ,并且将方法传递给Comparable<XParam> ,则编译器将推断T == Comparable<XParam> ,该方法将查看参数是否扩展了Comparable<T> == Comparable<Comparable<XParam>> 没有。

相信 ,如果使用XParam类型的参数调用该方法,则该方法将起作用,因为XParam extends Comparable<XParam>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM