7

是否可以将字段类型重载为另一种字段类型?

如果是这样,是否可以提供一些例子?

4

4 回答 4

7

您不能重载字段(只能重载方法),您可能会对覆盖字段感到困惑——这无论如何都是不可能的,您最终会从超类中隐藏字段。看看这个帖子

于 2012-07-13T16:05:14.847 回答
0

看看这段代码

class A<T> {
    protected T field1;
}

class B extends A<String> {
    public char field1;

    public static void main(String[] args) {
        A a = new B();
        a.field1 = 12442;
    }
}

它运行时没有任何异常,如果 field1 被覆盖,它应该引发异常,但它不会

而且这也毫无例外地运行

class A<T> {
    protected T field1;
}

class B extends A<Character> {
    public char field1;

    public static void main(String[] args) {
        A a = new B();
        a.field1 = 12442;
    }
}

不可能

于 2012-07-13T16:38:47.990 回答
0

我相信java支持接口,接口应该能够帮助你实现你想要实现的东西

这是我快速找到的一个例子

这是一个教程

只要确保您没有以这种方式超载公共成员。

于 2012-07-13T16:07:04.320 回答
0

Java 语言 (JLS) 不允许,但 Java 字节码 (JVMS) 允许

Oracle JDK 1.8.0_45 甚至依赖它来实现assert。例如:

public class Assert {
    static final int[] $assertionsDisabled = new int[0];
    public static void main(String[] args) {
        System.out.println(int.length);
        assert System.currentTimeMillis() == 0L;
    }
}

生成两个Oracle JDK 1.8.0_45,一个显式 ( int[]) 和一个合成 ( bool),并且很高兴能够区分它们。但是如果我们声明:

static final boolean $assertionsDisabled = false;

它将无法编译:

the symbol $assertionsDisabled conflicts with a compile synthesized symbo

有关更多详细信息,请参阅https://stackoverflow.com/a/31355548/895245

不可能的可能原因

问题是无法确定字段的类型。考虑:

void f(int i) { System.out.println("int"); }
void f(float i) { System.out.println("float"); }
int i;
float i;
// Which overridden method is called?
void m() { f(i); }
于 2015-07-11T09:35:47.457 回答