【问题标题】:java generics: Bound mismatch for stringjava泛型:字符串的绑定不匹配
【发布时间】:2020-10-16 10:44:07
【问题描述】:

我的代码如下,我收到了错误信息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&lt;K&gt; 更改为K extends Comparable&lt;K&gt;(不更改第一行;即使用Comparable 而不是myComparable),错误将得到解决。

为什么?以及如何使用我自己的myComparable

【问题讨论】:

  • 我如何使用我自己的 myComparable? 做什么?显然,标准的java.lang.String 类不是您的自定义myComparable 类型的子类。你真正想要发生什么?
  • 感谢您的帮助。我只想知道Comparable 是如何工作的。现在我根据您的提示,得到了如下解决方案。
  • 你应该遵循Java命名约定:变量名和方法名应该用驼峰命名。

标签: java generics inheritance types abstract-class


【解决方案1】:

当您编写implements myInterface&lt;String, String&gt; 时,您将K 类型变量“绑定”到String,并将V 类型变量“绑定”到String

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

它没有,这就是编译器不允许你这样做的原因。

java.lang.String 类实际上实现了Comparable&lt;String&gt; - 它就在 javadoc 以及源代码中,如果您愿意的话;你也可以直接施放:

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

原因是 sun/oracle 将字符串写为:public final class String implements Comparable&lt;String&gt;

它不是用implements myComparable&lt;String&gt;写的。

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

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

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

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 的接口似乎没什么用。

【讨论】:

    【解决方案2】:

    我终于找到了解决方案(即使用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!");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多