我们正在将Java 6项目升级到Java 8.使用Java 8重新编译会在java.awt.Frame子类中出现错误,我已简化为以下内容:
组织/示例/ Foo.java
package org.example;
import org.example.Type;
import java.awt.Frame;
public class Foo extends Frame {
public Foo() {
System.out.println(Type.BAZ); // <=== error here, BAZ cannot be resolved
}
}
组织/示例/ Type.java
package org.example;
public class Type {
public static final int BAZ = 1;
}
似乎正在发生的事情是,即使存在org.example.Type的导入,Java 7中引入的静态枚举java.awt.Window.Type也具有优先权。这是对的吗?
这是否意味着我们必须使用org.example.Type完全限定对Type的所有引用?
答案 0 :(得分:5)
似乎正在发生的是静态枚举java.awt.Window.Type在Java 7中引入优先级,即使org.example.Type有导入也是如此。这是对的吗?
是。 Type
类是新的,但行为不是。这是设计使然,而不是Java 8的新功能。
这是否意味着我们必须使用org.example.Type完全限定对Type的所有引用?
是的,只要您扩展包含Type
成员的类。
我会问你为什么要延长Frame
:大多数时候人们延长Frame
或JFrame
,他们不应该这样做。赞成组合而非继承,以及所有这些。
另一种方法可能是使用静态导入来专门导入Type
成员,在本例中为BAZ
。像这样的东西:
package org.example;
import static org.example.Type.BAZ;
import java.awt.Frame;
public class Foo extends Frame {
public Foo() {
System.out.println(BAZ);
}
}
如果Type
有一群成员,那将是一个痛苦的问题。另一种方法可能是使Type
成为一个接口,然后让Foo
实现该接口:
public interface Type {
public static final int BAZ = 1;
}
public class Foo extends Frame implements Type{
public Foo() {
System.out.println(BAZ);
}
}
您还可以在Type
课程中创建Foo
个实例,或重命名Type
以避免冲突,或在Foo
和{{1}之间建立桥梁}。
这些都是一些略微破解的解决方案,只是没有扩展Frame。