2012-07-13 61 views

回答

5

不能超載領域(僅方法可以被重載),你可能會與覆蓋領域的困惑 - 這無論如何是不可能的,你最終躲在從超領域。看看這個post

+1

我以爲是這樣,當他們找到我時,我有點困惑。我只用了三年Java編程,並沒有遇到過這個問題。只是想確保我沒有失去任何東西。 – 2012-07-13 16:14:47

+1

@BrandonWilson是不可能的 – Pooya 2012-07-13 16:35:43

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; 
    } 
} 

運行沒有任何異常,如果 字段1 overrided,它應該拋出一個異常,但它並不

而且這種運行沒有任何異常

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; 
    } 
} 

這是不可能

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); }