我们正在将
Java 6项目升级到
Java 8.使用Java 8重新编译会在java.awt.Frame子类中产生错误,我已经简化如下:
@H_403_2@组织/示例/ 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 } }@H_403_2@组织/示例/ Type.java
package org.example; public class Type { public static final int BAZ = 1; }@H_403_2@似乎发生的是,即使有一个org.example.Type的导入,Java 7中引入的静态枚举java.awt.Window.Type也是优先的.它是否正确? @H_403_2@这是否意味着我们必须使用org.example.Type完全限定对Type的所有引用?
解决方法
@H_403_2@What appears to be happening is a static enum java.awt.Window.Type introduced in Java 7 is taking precedence even though there is an import for org.example.Type. Is this correct?@H_403_2@是. Type类是新的,但行为不是.这是设计,而不是Java 8的新手.
@H_403_2@Does this mean we’ll have to fully qualify all references to our Type with org.example.Type?@H_403_2@是的,只要你扩展一个包含类型成员的类. @H_403_2@我会质疑你为什么延伸框架:大多数人延伸Frame或JFrame,他们不应该是.有利于构成遗产,所有这一切. @H_403_2@另一种方法可能是使用静态导入来专门导入类型成员,在这种情况下是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); } }@H_403_2@如果Type有一堆成员,那将是一个痛苦的脖子.另一种方法可能是使类型接口,然后让Foo实现该接口:
public interface Type { public static final int BAZ = 1; } public class Foo extends Frame implements Type{ public Foo() { System.out.println(BAZ); } }@H_403_2@您还可以在Foo类中创建一个Type实例,或者重命名Type以避免冲突,或在Foo和Type之间创建一个桥. @H_403_2@这些都是微不足道的解决方案,而不是延伸框架.