我们正在将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
}
}
Run Code Online (Sandbox Code Playgroud)
组织/示例/ Type.java
package org.example;
public class Type {
public static final int BAZ = 1;
}
Run Code Online (Sandbox Code Playgroud)
似乎正在发生的是静态枚举java.awt.Window.Type在Java 7中引入优先,即使org.example.Type有导入也是如此.它是否正确?
这是否意味着我们必须使用org.example.Type完全限定对Type的所有引用?
似乎正在发生的是静态枚举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);
}
}
Run Code Online (Sandbox Code Playgroud)
如果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);
}
}
Run Code Online (Sandbox Code Playgroud)
您还可以Type在Foo类中创建实例,或重命名Type以避免冲突,或在Foo和之间创建桥接Type.
这些都是略微破解的解决方案,只是没有扩展Frame.
| 归档时间: |
|
| 查看次数: |
211 次 |
| 最近记录: |