이 문제는 필자가 작성한 모듈에서 발생했지만 동일한 동작을 나타내는 최소한의 사례를 만들었습니다.여기에 유추가 입력되지 않는 이유는 무엇입니까?
class Minimal[T](x : T) {
def doSomething = x
}
object Sugar {
type S[T] = { def doSomething : T }
def apply[T, X <: S[T]] (x: X) = x.doSomething
}
object Error {
val a = new Minimal(4)
Sugar(a) // error: inferred [Nothing, Minimal[Int]] does not fit the bounds of apply
Sugar[Int, Minimal[Int]](a) // works as expected
}
문제는 컴파일러 Minimal
(Int
)에 내부 파라미터를 알아낼 관리이다, 그러나 명백하게 apply
일치하지 Nothing
-T
의 다른 발생을 설정한다. 첫 번째 매개 변수를 제거하면 두 번째 매개 변수가 제거되어 T가 정의되지 않는다고 불평하기 때문에 이들은 분명히 T
과 동일합니다.
컴파일러가 첫 번째 매개 변수를 유추 할 수 없다는 모호성이 있습니까? 아니면이 버그입니까? 이 문제를 정상적으로 해결할 수 있습니까?
추가 정보 :이 코드는 구문 설탕을 시도한 간단한 예입니다. 원래의 코드는 |(a)|
이 모듈이 a
인 것을 의미합니다. 여기서 a는 벡터입니다. 분명히 |(a)|
은 |[Float,Vector3[Float]](a)|
을 작성하는 것보다 낫지 만, 불행히도 이것을 더 쉽게 만들려면 을 사용할 수 없습니다.
실제 오류 : 구조 유형에 대한 경계 몇 가지 불확실성이있다
inferred type arguments [Nothing,Minimal[Int]] do not conform to method apply's type parameter bounds [T,X <: Sugar.S[T]]
예,이 솔루션은 제 경우에는 정상적으로 작동합니다. 그것은 또한 Joshua의 해결책 (미안한 Joshua!)보다 깨끗합니다. Joshua의 솔루션이 왜 작동하는지 설명 할 수 있습니까? – Dylan
Joshua의 해결책이 또한 작동하는 이유에 대한 설명을 제공하는 답변이 업데이트되었습니다. –