我知道有人问过类似的问题(这里,这里,这里),但似乎没有一个答案适用于我的案例。
考虑以下一组接口:
public interface I1<X> {
void method(X arg);
}
public interface I2 {
void method(String arg);
}
public interface I3 extends I1<String>, I2 {
// empty
}
现在我想在< code>I3的实例上调用< code >方法(String),如下所示:
public class C implements I3 {
public void method(String arg) {
// does nothing
}
public static void main(String[] args) {
((I3) new C()).method("arg");
}
}
OpenJDK(Java 7 或 8,无关紧要)在此处标记了不兼容错误:
generics\C.java:10: error: reference to method is ambiguous
((I3) new C()).method("arg");
^
both method method(String) in I2 and method method(X) in I1 match
where X is a type-variable:
X extends Object declared in interface I1
由于< code>X在< code>I3中被实例化为< code>String,我看不出问题出在哪里。请注意,Eclipse认为这没有问题。
为什么?这个问题的答案很简单,但可能不是你要找的。它是,“因为Eclipse和Open JDK都有自己的编译器,要么a)其中一个有错误,要么b)语言规范(JLS)含糊不清,他们对它的解释不同。”
弄清楚a)和b)中的哪一个是这种情况是一项棘手的、乏味的任务。这意味着,作为起点,阅读JLS的相关章节,尝试用甲骨文JDK公司的< code>javac编译相同的代码,并可能钻研Eclipse和OpenJDK的错误跟踪系统。
问题内容: 可以说我们有2个班级。空类和该类的子类。 然后在另一个类中有一些方法: 这可以在Java 7中编译并成功运行,但不能在Java 8中编译。错误: 为什么在Java 7中有效,但在Java 8中无效?怎么可能 永远匹配收集? 问题答案: 问题在于类型推断已得到改进。你有一个像 基本上说“调用者可以决定Base我返回哪个子类”,这显然是胡说八道。每个编译器都应(T)在此处针对你的类型转换发
我正在尝试使用Jetty服务器运行Jersey REST服务。当我在IntelliJ中运行时,出现以下错误: 如果我在Eclipse中运行同一个项目,它运行良好。为什么IDE会有所不同? WebserviceRunner。Java语言 建筑格拉德尔 注意:我认为这与我的类路径上有同一个Application类的两个不同版本有关。为什么我只导入一个?
问题内容: 我正在使用JUnit 4.12。断言方法本质上不是通用的。例如,assertEquals方法看起来像: 为什么不是这样? 我觉得需要通用方法声明来更好地进行编译时检查和IDE自动完成。 问题答案: 具有这样的通用方法: 没有避免避免比较不同类型的类型安全:您可以将任何内容传递给此方法,因为它会退化到其上限: 而且也不能使用任何方法和未上找到。因此,基本上就是。 这样,添加泛型只会使实现
我更喜欢后端而不是前端,但是JavaScript引起了我的兴趣。我试图把我的头围绕在我看来是多种不同的建模对象的方法上。 在过去的几年里,我主要是在编写与此类似的代码(假设jQuery已加载): 这样我就可以简单地调用来启用特定的表单,非常类似于PHP中的静态方法调用。 我最近一直在PHP中使用闭包,我知道它们在JavaScript中也存在(我正在使用它们)。我试图更彻底地理解这个概念。在遇到这个
问题内容: 我正在与我的CompSci教授交谈,他建议将所有String 方法编写为: 而不是: 这两行都可以编译,但是我想知道第一种方法的好处是什么?我一直都是后一种方式。错了吗 什么是普通/常规? 问题答案: 第一种方法确保执行比较时不会收到 NullPointerException 。当您尝试在不存在的对象上调用方法时,抛出(发生)此异常。 以下是一些相关的切线:仔细阅读风险自负 不过要注意
在OpenAPI/Swagger文件中声明“char”的正确方法是什么?我试过这些..但不起作用 我也很累,但运气不好