加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 16:38:16 所属栏目:Java 来源:网络整理
导读:我们正在将 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() { Sy
我们正在将 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之间创建一个桥.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读