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

Ada*_*dam 10 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
    }
}
Run Code Online (Sandbox Code Playgroud)

组织/示例/ Type.java

package org.example;

public class Type {
    public static final int BAZ = 1;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Kev*_*man 5

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

是.这个Type类是新的,但行为不是.这是设计使用,而不是Java 8的新功能.

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

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

我会质疑为什么你会延伸Frame:大多数时候人们延伸,Frame或者JFrame他们不应该延伸.赞成组合而不是继承,以及所有这些.

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

如果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);  
    }
}
Run Code Online (Sandbox Code Playgroud)

您还可以TypeFoo类中创建实例,或重命名Type以避免冲突,或在Foo和之间创建桥接Type.

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