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

前端之家收集整理的这篇文章主要介绍了Java 8升级导致编译器错误与继承的静态枚举前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我们正在将 Java 6项目升级Java 8.使用Java 8重新编译会在java.awt.Frame子类中产生错误,我已经简化如下: @H_403_2@组织/示例/ 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
    }
}
@H_403_2@组织/示例/ Type.java

package org.example;

public class Type {
    public static final int BAZ = 1;
}
@H_403_2@似乎发生的是,即使有一个org.example.Type的导入,Java 7中引入的静态枚举java.awt.Window.Type也是优先的.它是否正确?

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

解决方法

@H_403_2@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?

@H_403_2@是. Type类是新的,但行为不是.这是设计,而不是Java 8的新手.

@H_403_2@Does this mean we’ll have to fully qualify all references to our Type with org.example.Type?

@H_403_2@是的,只要你扩展一个包含类型成员的类.

@H_403_2@我会质疑你为什么延伸框架:大多数人延伸Frame或JFrame,他们不应该是.有利于构成遗产,所有这一切.

@H_403_2@另一种方法可能是使用静态导入来专门导入类型成员,在这种情况下是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);  
   }
}
@H_403_2@如果Type有一堆成员,那将是一个痛苦的脖子.另一种方法可能是使类型接口,然后让Foo实现该接口:

public interface Type {
    public static final int BAZ = 1;
}
public class Foo extends Frame implements Type{
    public Foo() {
        System.out.println(BAZ);  
    }
}
@H_403_2@您还可以在Foo类中创建一个Type实例,或者重命名Type以避免冲突,或在Foo和Type之间创建一个桥.

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

猜你在找的Java相关文章