2016-11-17 46 views
0

我有這樣的代碼:重寫只有一個方法在Java接口的一個重載方法

public interface AsyncResponse { 
    abstract void processFinish(JSONObject output); 
    abstract void processFinish(String output); 
} 

我使用這樣的:

new AsyncResponse(){ 
    @Override 
    public void processFinish(JSONObject output) { 
     //code 
    } 

    @Override 
    public void processFinish(String output) { 
     //code 
    } 
} 

當我重載只有一個方法(例如僅JSONObject)它給出了錯誤:
類'從AsyncResponse派生的匿名類'必須聲明爲抽象或在'AsyncResponse'中實現抽象方法'processFinish(String)'

如果有可能,我只需要重載一種方法,而不是兩種。 我不知道它是否與AsyncTask類似,其中只有doInBackground被要求爲Override -ed,而onther方法是可選的。

不知道我是否對我的問題使用了正確的編程術語,但我希望,我需要做的是明確的。

回答

1

這是不可能的,除非你拆分接口轉換成2:

public interface AsyncResponseWithJSONObject { 
    void processFinish(JSONObject output); 
} 
public interface AsyncResponseWithString { 
    void processFinish(String output); 
} 

,可以處理字符串實現後者,並能夠處理JSON實現前者類的類。

Then why can AsyncTask do it?

AsyncTask抽象類,而不是一個接口。擴展抽象類時,只需實現abstract方法。另一方面,接口需要實施所有的方法。 (因爲在接口中的所有方法都隱含抽象)

所以,你可以嘗試使用抽象類以及:

public abstract class AsyncResponse { 
    public void processFinish(JSONObject output) { 

    } 

    public void processFinish(String output) { 

    } 
} 
1

如果您正在實現一個接口,則必須覆蓋其中的所有方法。沒有其他辦法了。

如果你想部分覆蓋它,使AsyncResponse一類,像這樣:

public class AsyncResponse { 
    public void processFinish(JSONObject output) { 
    } 
    public void processFinish(String output) { 
    } 
} 

現在,當你擴展這個類,沒有要求,你必須覆蓋所有方法。

1

您可以添加默認的界面(Java8起)

public interface AsyncResponse { 
    abstract void processFinish(JSONObject output); 
    default void processFinish(String output) { 
     // some code 
    } 
} 
0

發生了什麼事?:

public interface AsyncResponse<T> { 
    void processFinish(T output); 
} 

即使它不超載,這似乎很簡單:在我眼裏。