Java 8升级导致编译器错误与继承的静态枚举
我们正在将
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的所有引用? 解决方法
是. Type类是新的,但行为不是.这是设计,而不是Java 8的新手.
是的,只要你扩展一个包含类型成员的类. 我会质疑你为什么延伸框架:大多数人延伸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之间创建一个桥. 这些都是微不足道的解决方案,而不是延伸框架. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |