我们正在将
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的所有引用?
解决方法
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?
是. Type类是新的,但行为不是.这是设计,而不是Java 8的新手.
Does this mean we’ll have to fully qualify all references to our Type with org.example.Type?
是的,只要你扩展一个包含类型成员的类.
我会质疑你为什么延伸框架:大多数人延伸Frame或JFrame,他们不应该是.有利于构成遗产,所有这一切.
另一种方法可能是使用静态导入来专门导入类型成员,在这种情况下是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有一堆成员,那将是一个痛苦的脖子.另一种方法可能是使类型接口,然后让Foo实现该接口:
public interface Type { public static final int BAZ = 1; } public class Foo extends Frame implements Type{ public Foo() { System.out.println(BAZ); } }
您还可以在Foo类中创建一个Type实例,或者重命名Type以避免冲突,或在Foo和Type之间创建一个桥.
这些都是微不足道的解决方案,而不是延伸框架.