[英]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.