2012-02-24 154 views
0

下面是代碼:爲什麼會導致「字段名稱不明確」錯誤?

public class MyClass implements Inreface1, Inreface2 { 
    public MyClass() { 
     System.out.println("name is :: " + name); 
    } 

    public static void main(String[] args) { 
     new MyClass(); 
    } 
} 
//Interface1 
public interface Inreface1 { 
    public String name="Name"; 
} 
//Interface2 
public interface Inreface2 { 
    public String name="Name"; 
} 

以下是錯誤會引起:

字段名稱不明確

問題是什麼?什麼是模糊的?

+3

*「我努力,但無法找到窩d曖昧」 * - [我不相信你](http://i.imgur.com/eQBee.png)。 – 2012-02-24 12:18:29

+0

@alextsc - 你均值;) – pap 2012-02-24 12:32:25

+0

我的第一個雖然是:「我不關心不確定性,但怎麼_hell_沒有Java的抱怨_interfaces._ _fields_」 1.8只是不斷給我猜 – RecursiveExceptionException 2016-06-26 23:39:04

回答

7

您的班級正在實施兩個界面,並且在他們兩個上都定義了變量name。因此,當您在班級中致電name時,Java無法確定該變量是指Interface1.name還是Interface.name

這是在你的代碼的問題...

+0

日Thnx爲了回答,但什麼是模糊的? – 2012-02-24 12:15:40

+2

http://www.thefreedictionary.com/ambiguous – nhaarman 2012-02-24 12:16:40

+3

和修復它是類名的前綴的方式:'「的名字是」 + Inreface1.name' – Thilo 2012-02-24 12:16:48

1

MyClass實現兩個接口,其中兩個有name變量。在MyClass的構造函數中,Java不知道選擇哪個name - 來自Inreface1的那個或Inreface2的那個。你可以明確地告訴它:

public MyClass() { 
    System.out.println("name is :: " + Inreface1.name); 
} 
0

看起來你指的是同一個變量。

我認爲編譯器不知道你想傳遞哪個值。你有沒有嘗試改變字段變量?

0

什麼是模糊的?

如果具有相同名稱的兩個字段中由接口 繼承,因爲,例如,它的兩個直接超接口的聲明字段 具有該名稱,則單個曖昧構件結果。任何使用 這個不明確的成員將導致編譯時錯誤。因此,在 例如:

interface BaseColors { 
     int RED = 1, GREEN = 2, BLUE = 4; 
    } 
    interface RainbowColors extends BaseColors { 
     int YELLOW = 3, ORANGE = 5, INDIGO = 6, VIOLET = 7; 
    } 
    interface PrintColors extends BaseColors { 
     int YELLOW = 8, CYAN = 16, MAGENTA = 32; 
    } 
    interface LotsOfColors extends RainbowColors, PrintColors { 
     int FUCHSIA = 17, VERMILION = 43, CHARTREUSE = RED+90; 
    } 

接口LotsOfColors繼承命名YELLOW兩個字段。這個是 沒關係,只要界面不包含任何由 引用的簡單名字就可以了。 (這樣的參考可以內 發生變量初始值設定爲一個字段。)

即使接口PrintColors 要奉獻值3 YELLOW而不是值8, 參考接口LotsOfColors將仍然內字段YELLOW被認爲是模棱兩可的 。

1

看看你的代碼:

System.out.println("name is :: " + name); 

其中 「名」 應該編譯器使用?我含糊不清,因爲可能是Inreface1.name或Inreface2.name。 如果您通過指定一個「名稱」來清除歧義,則錯誤應該消失。例如:

System.out.println("name is :: " + Inreface1.name); 
0

另一點是實例變量在接口中是不允許的。你的公共字符串變成一個常量:public static String name; - 你得到兩次。具有相同名稱/類型的多個常量絕對是不明確的。

相關問題