是否可以将字段类型重载为另一种字段类型?
如果是这样,是否可以提供一些例子?
您不能重载字段(只能重载方法),您可能会对覆盖字段感到困惑——这无论如何都是不可能的,您最终会从超类中隐藏字段。看看这个帖子。
看看这段代码
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;
}
}
不可能
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); }