2017-04-05 83 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暗示的接口,我预计这可能与它有关。

编辑:

增加了一个回答你的问题,改造一个更简洁的解决方案。