Java 8升级导致编译器错误与继承的静态枚举

时间:2015-06-11 14:19:37

标签: java 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的所有引用?

1 个答案:

答案 0 :(得分:5)

  

似乎正在发生的是静态枚举java.awt.Window.Type在Java 7中引入优先级,即使org.example.Type有导入也是如此。这是对的吗?

是。 Type类是新的,但行为不是。这是设计使然,而不是Java 8的新功能。

  

这是否意味着我们必须使用org.example.Type完全限定对Type的所有引用?

是的,只要您扩展包含Type成员的类。

我会问你为什么要延长Frame:大多数时候人们延长FrameJFrame,他们不应该这样做。赞成组合而非继承,以及所有这些。

另一种方法可能是使用静态导入来专门导入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);  
   }
}

如果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);  
    }
}

您还可以在Type课程中创建Foo个实例,或重命名Type以避免冲突,或在Foo和{{1}之间建立桥梁}。

这些都是一些略微破解的解决方案,只是没有扩展Frame。