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的所有引用?

解决方法

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之间创建一个桥.

这些都是微不足道的解决方案,而不是延伸框架.

相关文章

最近看了一下学习资料,感觉进制转换其实还是挺有意思的,尤...
/*HashSet 基本操作 * --set:元素是无序的,存入和取出顺序不...
/*list 基本操作 * * List a=new List(); * 增 * a.add(inde...
/* * 内部类 * */ 1 class OutClass{ 2 //定义外部类的成员变...
集合的操作Iterator、Collection、Set和HashSet关系Iterator...
接口中常量的修饰关键字:public,static,final(常量)函数...