是否可以将字段类型重载为另一种字段类型?
如果是这样,是否可以提供一些例子?
答案 0 :(得分:6)
你不能重载字段(只有方法可以重载),你可能会对覆盖字段感到困惑 - 无论如何这是不可能的,你最终隐藏了来自超类的字段。看一下这个post。
答案 1 :(得分:0)
答案 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); }