gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:59:55 24 4
gpt4 key购买 nike

我们正在将 Java 6 项目升级到 Java 8。使用 Java 8 重新编译会在 java.awt.Frame 子类中出现错误,我已简化为以下内容:

org/example/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
}
}

org/example/Type.java

package org.example;

public class Type {
public static final int BAZ = 1;
}

似乎发生的是一个静态枚举 java.awt.Window.Type尽管存在 org.example.Type 的导入,但 Java 7 中引入的优先级更高。这是正确的吗?

这是否意味着我们必须使用 org.example.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?

是的,只要您扩展的类包含 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 成为一个接口(interface),然后让 Foo 实现该接口(interface):

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 以避免冲突,或者在 FooType

尽管这些都是简单地不扩展 Frame 的稍微老套的解决方案。

关于Java 8 升级导致继承静态枚举的编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30783478/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com