2017-04-05 38 views
3

我有一個Java類文件,它工作正常,但如果我將它轉換爲Kotlin它會造成一些問題。這裏是一個Java版本轉換java類文件爲kotlin使編譯錯誤

public class CallbackWrapper<T> implements Callback<T> { 
    private Wrapper<T> wrapper; 

    public CallbackWrapper(Wrapper<T> wrapper) { 
     this.wrapper = wrapper; 
    } 

    public void onFailure(Call<T> call, Throwable t) { 
     wrapper.onResult(t, null); 
    } 

    public void onResponse(Call<T> call, Response<T> response) { 
     wrapper.onResult(null, response); 
    } 

    public interface Wrapper<T> { 
     void onResult(@Nullable Throwable t, @Nullable Response<T> response); 
    } 
} 

這是我如何使用這個類沒有任何問題......

request.enqueue(CallbackWrapper<RegisterResponse> { throwable, response -> 
    response?.let { callBack.onResponse(response.body() ?: RegisterResponse()) } 
    throwable?.let { callBack.onFailed(throwable.message!!) } 
}) 

這裏是科特林版本轉換

class CallbackWrapper<T>(private val wrapper: CallbackWrapper.Wrapper<T>) : Callback<T> { 

    override fun onFailure(call: Call<T>, t: Throwable) { 
     wrapper.onResult(t, null) 
    } 

    override fun onResponse(call: Call<T>, response: Response<T>) { 
     wrapper.onResult(null, response) 
    } 

    interface Wrapper<T> { 
     fun onResult(t: Throwable?, response: Response<T>?) 
    } 
} 

後問題在於,在將它轉換爲Kotlin之後,我使用這個類的代碼塊不起作用。我不明白他們之間有什麼區別。

以下是編譯錯誤日誌

Error:(17, 63) Type mismatch: inferred type is (???, ???) -> [ERROR :<ERROR FUNCTION RETURN TYPE>] but CallbackWrapper.Wrapper<RegisterResponse> was expected 
Error:(17, 65) Cannot infer a type for this parameter. Please specify it explicitly. 
Error:(17, 76) Cannot infer a type for this parameter. Please specify it explicitly. 

回答

3

你有兩個問題與您的代碼,據我可以告訴。

首先,Kotlin不允許使用lambdas來實現Kotlin函數接口,所以你的lambda不會工作(它確實允許實現Java函數接口,因爲Java沒有適當的函數類型)。所以調用代碼不變,要使用對象符號來代替:

request.enqueue(CallbackWrapper<RegisterResponse>(object : CallbackWrapper.Wrapper<RegisterResponse> { 
     override fun onResult(throwable: Throwable?, response: Response<RegisterResponse>?) { 
      response?.let { callBack.onResponse(response.body() ?: RegisterResponse()) } 
      throwable?.let { callBack.onFailure(throwable.message!!) } 
     } 
    })) 

如果你喜歡使用lambda表達式可以不同的聲明你CallbackWrapper類:

typealias Wrapper<T> = (t: Throwable?, response: Response<T>?) -> Unit 
class OtherCallbackWrapper<T>(val wrapper: Wrapper<T>) : Callback<T> { 
    override fun onFailure(call: Call<T>, t: Throwable) = wrapper.invoke(t, null) 
    override fun onResponse(call: Call<T>, response: Response<T>) = wrapper.invoke(null, response) 
} 

所以這是but CallbackWrapper.Wrapper<RegisterResponse> was expected 部分照顧。

儘管如此,這仍然不起作用,這導致我們錯誤消息的前半部分爲inferred type is (???, ???) -> [ERROR :<ERROR FUNCTION RETURN TYPE>]。這基本上是類型推斷失敗。撥打callBack的電話似乎並不符合CallbackWrapper暗示的接口,我預計這可能與它有關。

編輯:

增加了一個回答你的問題,改造一個更簡潔的解決方案。