2017-02-22 1 views
2

나는 기본 인수 값이 기본 없다는 이상한 경우를 발견했습니다인수를 기본값으로 만드는 방법은 무엇입니까?

class Dog 
class DogHouse(dog: Dog) 

inline fun <T: Any, A: Any> build(sth: String = "", call: (A) -> T) {} 

fun main(args: Array<String>) { 
    build(call = ::DogHouse) 
    build(::DogHouse) // This line fails to compile 
} 

컴파일 오류 :

Error:(11, 5) Kotlin: Type inference failed: inline fun <T : Any, A : Any> build(sth: String = ..., call: (A) -> T): Unit 
cannot be applied to 
(KFunction1<@ParameterName Dog, DogHouse>) 

Error:(11, 11) Kotlin: Type mismatch: inferred type is KFunction1<@ParameterName Dog, DogHouse> but String was expected 

Error:(11, 21) Kotlin: No value passed for parameter call 

답변

7

은 기본 인수 함수에 전화를 걸 때 여전히를 암시 적으로 무시하고 다음 인수를 전달할 수 없으면 명시 적으로 명명 된 인수 만 사용하면됩니다.

예 : 그것은 기본 인수 앞에 위치하기 때문에

fun f(x: Int, y: Double = 0.0, z: String) { /*...*/ } 
  • 당신은 항상 비라는 이름의 인수로 x을 전달할 수 있습니다

    당신이 할 수있는
    f(1, z = "abc") 
    
  • 물론, 모든 인수를 순서대로 전달하십시오.

    f(1, 1.0, "abc") 
    
  • 하지만 당신은 기본 인수를 생략하고 명시적인 레이블없이 다음과 같은 사람들을 전달할 수 없습니다 :

    f(1, "abc") // ERROR 
    f(1, z = "abc") // OK 
    

당신이 명명 된 인수를 사용하지 않는 기본적으로 (demo of this code)

,의 인수는 기본 인수를 건너 뛰지 않고 매개 변수 순서로 전달됩니다.

fun g(x: Int = 0, action:() -> Unit) { action() } 

g(0) { println("abc") } 
g { println("abc") } // OK 
:

유일한 예외는 그 기능 유형이 때 마지막 인자의 코드 블록 구문 이루어진다

관련 문제