2012-09-06 32 views
0

是否有人面臨這樣的問題?該字段永遠不會在本地讀取(catch-22)

某些字段標有警告 「這個領域是從來沒有在本地讀」:

enter image description here

但是當我抑制警告,它Eclipse啓動聲稱,這是不必要的:

enter image description here

因此,我無法擺脫警告。

的Eclipse SDK 3.6.2

編輯:

意圖是抽象的BlockBase類。但將abstract關鍵字添加到類中並將構造函數的可見性更改爲protected不會改變任何內容。我猜這種行爲的真正原因是類市場是私有的,因此編譯器假定應該從類可見區域內部訪問字段。它沒有考慮到這些字段可能會從具有另一可見性的子項訪問(public class DataBlock extends BlockBase)。

我改變了BlockBaseprotected的知名度和它解決了的問題。我不喜歡將其更改爲公開,因爲這會導致BlockBase將從父類外部可見,但將可見性更改爲protected不會更改任何內容,因爲我的父類沒有繼承類。

但無論如何,這種編譯器行爲是不正確的。

enter image description here

編輯2

- 或 -

如何重現問題

1.第一文件:

public class testClass { 

    private abstract class x 
    { 
     public int theProblem; 
    } 

    public class y extends x 
    { 
    } 

} 

2.第二個文件:

public class anotherClass { 

    public void accessToTheProblem() 
    { 
     testClass.y a = (new testClass()).new y(); 
     a.theProblem = 5; 
     Log.i("TEST", "See, I can read theProblem: " + a.theProblem); 
    } 

} 

下的Eclipse SDK 3.6.2,你會看到theProblem宣言市場警告:

領域是從來沒有在本地讀

+0

難道你不能只讀他們的地方?我的意思是假的讀他們。例如在一個構造函數中。這不是最優雅的解決方案,但哦。 – SmartK8

+0

如果您不想使用它們,請輸入私有的getter和setter? – Kaediil

+0

除此之外。警告可能是有效的,所以你不應該壓制它,而是記住未使用的字段,並優化它們或將來使用它們。 – SmartK8

回答

4

也許你打算讓BlockBase成爲abstract class like BaseAdapter

  • 如果你不聲明BlockBase對象與blockBase = new BlockBase(widget);再加入abstract到類定義,並刪除你的構造計劃。編譯器會明白你打算在子類中使用這些變量,它將刪除警告。

  • 否則,編譯器是正確的,你應該刪除這些變量,因爲它們永遠不會在BlockBase中使用。 (如果您打算在DataBlock使用它們,再切&它們粘貼在那裏,但他們是毫無意義的BlockBase。)

+0

你的第一個建議是正確的,但編譯不理解我的計劃,如你所料。我編輯了問題,請看看新的截圖。 –

+0

該問題已通過將'BlockBase'類的可見性更改爲'protected'解決。它並沒有真正改變可視性,所以它是可以接受的解決方案,但我仍然不能說編譯器是正確的。 –

+0

我很高興你找到_a_解決方案。但是我很好奇,因爲我無法用JDK設置爲1.5或1.6來重新創建錯誤。當「BlockBase」是「私人抽象」時,你是否嘗試清理和重建? – Sam

0

在某些情況下,編譯器添加合成的方法來模擬訪問嵌套/外的領域類。也許這會讓支票在這裏混淆。您應該能夠通過將Eclipse編譯器警告首選項「訪問不可訪問的封閉類型成員」設置爲高於「忽略」的內容來驗證這是否起作用。

此外,我建議升級到3.8或4.2,也許我們正在推測一個長期固定的錯誤。

相關問題