繁体   English   中英

java generics:字符串绑定不匹配

[英]java generics: Bound mismatch for string

我的代码如下,我收到错误消息Bound Mismatch Error: The type String is not a valid substitute for the bounded parameter <K extends myComparable<K>> of the type myInterface<K,V>

interface myComparable<T> {
    public int compareTo(T o);
}

interface myInterface<K extends myComparable<K>, V> {  
}

public class myClass implements myInterface<String,String>{          
    public static void main(String[] args) {
    System.out.println("Hello world!");
    }    
}

但是,如果我将K extends myComparable<K>更改为K extends Comparable<K> (不更改第一行;即使用Comparable而不是myComparable ),错误将得到解决。

为什么? 我怎样才能使用我自己的myComparable

我终于得到了一个解决方案(即使用myString而不是String ):

interface myComparable<T> {
    public int compareTo(T o);
}

interface myInterface<K extends myComparable<K>, V> {
}

class myString implements myComparable<myString>{
    @Override
    public int compareTo(myString o) {
        return 0;
    }   
}

public class myClass implements myInterface<myString,myString>{      
    public static void main(String[] args) {
    System.out.println("Hello world!");
    }
}

当您编写implements myInterface<String, String>时,您将K类型变量“绑定”到String ,将 V 类型变量“绑定”到String

特别是 K 类型变量的声明有一个界限:您已将其声明为myInterface<K extends myComparable<K>, V>这意味着您为K选择的任何界限必须至少“符合”此限制。

它没有,这就是为什么编译器不会让你。

java.lang.String class 实际上实现了Comparable<String> - 如果您想看的话,它就在 javadoc 和源代码中; 你也可以直接施放它:

Comparable<String> test = "hello"; // this compiles and runs fine.

原因是该字符串由 sun/oracle 编写为: public final class String implements Comparable<String>

它不是用implements myComparable<String>编写的。

不可能让 java.lang.String 实现你的接口

这不是接口的工作方式。 java 是名义上而非结构上的类型:您不能仅仅因为它们碰巧有一个compareTo方法就规定所有字符串都是 myComparables。

想象一下它是这样工作的,我写了这个 class:

public class Gun {
    public void shoot(Person person) { ... }
}

相当危险的班级!

假设它以您看起来事物的方式工作。 然后我可以这样做:

public interface Camera {
    public void shoot(Person p);
}

Camera c = new Gun();
c.shoot(somebody);

天哪,现在我们面临着极其危险的情况。 幸运的是,java不是这样工作的; 枪不是相机。 尽管它恰好具有 Camera 接口声明的所有方法。

当然,您可以创建自己的类型来实现自己的接口。 那没问题。 但是,一般来说,创建一个名为myComparable的接口似乎没有用。

暂无
暂无

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

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