2016-10-01 2 views

답변

3

이것은 Kotlin의 유형 추론에 문제가있는 것 같습니다 (버그인지 디자인인지는 모르겠습니다). 유형이 명시하는 경우 예를 들어,이 컴파일되지 않습니다 :

check<String, Int>("Hello", String::length, "banana") 
컴파일러가 RT의 공통의 슈퍼 타입을 유추하기 때문에 아마이 있습니다 자바의 제네릭 메서드의 형식 유추처럼 작동하도록 설계되었습니다

두 매개 변수 모두. (나는 그것을 시도하지 않은) 자바 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")) 
+0

을 나는 버그라고 생각하지 않는다. 내 함수의 제네릭 타입은 Any가 만족하므로 컴파일된다. 참고 문헌에 인용 된 Array.fill 예제도 Kotin Generics 문서에 인용되어 있지만 Use-Site Variance 사용에 실패했습니다. –

+0

http://stackoverflow.com/q/39596420/97777에 대한 답변 에서처럼 메서드 호출 뒤에 형식 마샬링 개체 생성을 숨길 수 있다고 생각합니다. 실제로 같은 질문을 의심합니다. –

관련 문제