2017-10-02 3 views
1

말을 연산 식 :재정의 여러 인터페이스 메소드가 나는 두 가지 방법 <code>onCurrentLocation</code>와 <code>onError</code>와 <code>Callbacks</code> 인터페이스가

public interface Callbacks { 

     void onCurrentLocation(ClientLocation location); 

     void onError(); 
    } 

하고 생성자에서이 인터페이스를 취하는 클래스는 말한다 :

public MyLocationClient(Callbacks callbacks) {...} 

이제 Kotlin에서 MyLocationClient를이 방식으로 인스턴스화 할 수 있어야합니까?

val myLocationClient = MyLocationClient(
        { location: ClientLocation -> 
          updateClientLocation(location) 
        }, 
        {}) 

만약 그렇지 않다면 왜 안됩니까?

내가보기에는 다음과 같은 동작이 있습니다. 인터페이스에 하나의 메서드 만 있으면이 개체의 생성이 올바르게 컴파일됩니다. 그러나, 최대한 빨리 Callbacks에 더 많은 방법을 추가 할 때, 컴파일러는

. "형식 불일치 필수 : ​​찾을 콜백! (ClientLocation을) -> 단위"불평

편집 : 널 (null)을 제거 질문과 관련이 없으므로 location을 확인하십시오. , 나는 이것이 좋은 일이 생각

val myLocationClient = MyLocationClient(object : Callbacks { 

     override fun onCurrentLocation(location : ClientLocation?){ 
      location?.let{ updateLocation(it) } 
     } 

     override fun onError(){ // should you not handle errors? } 
    }) 

답변

0

: 그래서 당신은 기능적인 인터페이스가 아닌 익명의 클래스 인스턴스를 만들

+1

나는 이것을 이해하는 것으로 생각하고 있습니다. 왜냐하면 이해하고 있기 때문에 이것이 내가 묻는 것을 실제로 할 수없는 이유이기 때문입니다. – sophia

2

는 (그들은 단지 하나 개의 방법이) 그래서 뭔가처럼은 될 것이다 인터페이스가 동일한 유형의 두 가지 기능을 가지고있을 때 무엇을하기 때문에 작동하지 않는 것입니까?

public interface Callbacks { 
    void anotherFunction(ClientLocation location); 

    void onCurrentLocation(ClientLocation location); 
} 

이렇게 이것을 SAM (단일 추상화) 인터페이스로 제한하는 것이 좋은 방법입니다.

+0

예,이 코드는 정상적으로 작동하지만 kotlin lambdas를 사용하여 "상용구"코드를 피하려고합니다. 사실 그것은 내 질문의 요지입니다. – sophia

+0

왜, Kotlin에서 쓰여졌는지, 즉 동일한 익명 클래스의 메서드 구현 사이에','를 사용하는 것은 Kotlin에서 유효하지 않은 기능적인 인터페이스가없는 이유에 대해 설명했습니다. 더 적은 보일러 플레이트를 생성하여 2 개의 함수 인터페이스로 나누고 생성자에 2 개의 인수를 사용하려면 구현이 작동하거나 어쨌든 구현이 있으므로 인터페이스에서'onError()를 제거하십시오. –

+0

오 죄송합니다. 기능적인 인터페이스가 무엇인지 찾아 보지 않았습니다. 어디서나 Kotlin 문서에 있나요? – sophia

0

당신은

class CallbacksImpl(private val onCurrentLocationF: (ClientLocation) -> Unit, private val onErrorF:() -> Unit) : Callbacks { 
    override fun onCurrentLocation(location : ClientLocation) { onCurrentLocationF(location) } 

    override fun onError() { onErrorF() } 
} 

을 정의하고 사용할 수 있습니다 그것은

MyLocationClient(CallbacksImpl(
    { location -> updateClientLocation(location) }, 
    {})) 

그것은 여전히 ​​상용구를 가지고 있지만 쉽게 좋은 트레이드 오프가 될 수 인터페이스 당 대신 사용 당 한 번, 이렇게하면.

0
interface IAnimatedRatingBar { 
    fun setProgressImageResource(resourceId: Int) 


    fun setProgressImageDrawable(drawable: Drawable) 


    fun setSecondaryProgressImageResource(resourceId: Int) 


    fun setSecondaryProgressImageDrawable(drawable: Drawable) 

    fun startAnimate() 
} 

잘 작동합니다.

+0

이것을 함수 인수로 전달하는 데 사용한 구문을 포함 할 수 있습니까? – sophia