微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

原文地址:https://www.jb51.cc/java/124677.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐