2015-03-02 82 views
-1

當編譯下面的代碼,我得到了編譯錯誤:錯誤:從內部類訪問局部變量;需要聲明的最終

MadScientist.java:27: Error: local variable timeTraveler is accessed from within inner class; needs to be declared final

import java.util.*; 

interface TimeTravelCallback { 
    void leaped(int amount); 
} 
interface TimeTraveler { 
    void adjust(int amount); 
} 
class LinearTimeTraveler implements TimeTraveler { 
    @Override public void adjust(int amount) { 

    } 
} 

public class MadScientist { 

    public static void main(String[] args) { 

    MadScientist madScientist = new MadScientist(); 
    TimeTraveler linearTimeTraveler = new LinearTimeTraveler(); 
    madScientist.experiment(linearTimeTraveler); 
    } 

    public void experiment(TimeTraveler timeTraveler) { 
     TimeTravelCallback cb = new TimeTravelCallback() { 
      @Override public void leaped(int amount) { 
       timeTraveler.adjust(amount); //error message 
      } 
     }; 
     cb.leaped(20); 
    } 
} 

如果我改變

public void experiment(TimeTraveler timeTraveler) { 

public void experiment(final TimeTraveler timeTraveler) { 

則作品。

是否有任何其他修補程序沒有在方法參數中添加'final'?

+0

http://stackoverflow.com/questions/4732544/why-only-final-variables-accessible-in-anonymous-class – 2015-03-02 07:20:08

+0

*是否有任何其他修復程序未在方法參數中添加'final'?* - 否。將它聲明爲最終的問題是什麼*?它仍然是*可變的*。 – TheLostMind 2015-03-02 07:20:50

+0

@TheLostMind:那麼,參數本身不會變化--OP將無法更改其值。但它仍然會引用一個可變對象。 – 2015-03-02 07:23:56

回答

0

如果你想對你的final變量進行任何操作,傳遞給你的方法,然後使用任何收集API如List

public void experiment(final List<TimeTraveler> timeTraveler) { 

} 

現在,您可以修改列表中的值。

0

如果你不希望添加最終,你應該在你的內部類TimeTravelCallback創建一個構造函數和timeTraveler對象傳遞給這個構造:

TimeTravelCallback cb = new TimeTravelCallback(timeTraveler) { 
     public TimeTravelCallback(TimeTraveler timeTraveler){ 
      this.timeTraveler = timeTraveler; 
     } 
     @Override public void leaped(int amount) { 
      timeTraveler.adjust(amount); //error message 
     } 
    };