이것은 Kotlin의 유형 추론에 문제가있는 것 같습니다 (버그인지 디자인인지는 모르겠습니다). 유형이 명시하는 경우 예를 들어,이 컴파일되지 않습니다 :
check<String, Int>("Hello", String::length, "banana")
컴파일러가
R
및
T
의 공통의 슈퍼 타입을 유추하기 때문에 아마이 있습니다 자바의 제네릭 메서드의 형식 유추처럼 작동하도록 설계되었습니다
두 매개 변수 모두. (나는 그것을 시도하지 않은) 자바 5, 6 위의 포스트에 따르면, Why doesn't type argument inference fail when I provide inconsistent method arguments?
참조, 7 당신은 아마 컴파일하지 않을
fun <T, R, R1: R> check(thing: T, property: KProperty1<T, R>, value: R1) =
property.get(thing) == value
과 일치하지 PARAMS와 전화처럼 선언 할 수 . 그러나 이것은 버그로 간주되었고 Java 8에서는 불일치 매개 변수가있는 호출이 여전히 컴파일됩니다 (시도했습니다). 어떤 경우
, 당신은 추론을 피하기 위해 클래스에 포장 할 수와 함께 입력 매개 변수를 묶어 :
class Checker<T, R>(val property: KProperty1<T, R>) {
fun check(thing: T, value: R) =
property.get(thing) == value
}
assertTrue(Checker(String::length).check("Hello", 5))
// does not compile
assertTrue(Checker(String::length).check("Hello", "banana"))
관련 http://stackoverflow.com/q/39596420/97777 –