按另一种字段类型重载Java数据字段类型

时间:2012-07-13 16:01:56

标签: java

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

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

4 个答案:

答案 0 :(得分:6)

你不能重载字段(只有方法可以重载),你可能会对覆盖字段感到困惑 - 无论如何这是不可能的,你最终隐藏了来自超类的字段。看一下这个post

答案 1 :(得分:0)

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

here's an example i found quick

here's a tutorial

确保您不会以这种方式超载公共成员。

答案 2 :(得分: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;
    }
}

这是不可能的

答案 3 :(得分: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); }