Khi tôi cố gắng biên dịch ví dụ nhỏ:Loại suy ra để có gì trong Scala
trait Foo[A,B] {
type F[_,_]
def foo(): F[A,B]
}
class Bar[A,B] extends Foo[A,B] {
type F[D,E] = Bar[D,E]
def foo() = this
}
object Helper {
def callFoo[A,B,FF <: Foo[A,B]](f: FF): FF#F[A,B] =
f.foo()
}
object Run extends App {
val x = new Bar[Int,Double]
val y = Helper.callFoo(x)
println(y.getClass)
}
tôi nhận được lỗi:
[error] src/Issue.scala:20: inferred type arguments
[Nothing,Nothing,issue.Bar[Int,Double]] do not conform to method callFoo's type
parameter bounds [A,B,FF <: issue.Foo[A,B]]
[error] val y = Helper.callFoo(x)
Rõ ràng, cơ chế suy luận kiểu không có khả năng suy ra A và B ngoài Bar [A, B]. Tuy nhiên, nó hoạt động nếu tôi vượt qua tất cả các loại bằng tay:
val y = Helper.callFoo[Int,Double,Bar[Int,Double]](x)
Tôi có cách nào để tránh loại bỏ một cách rõ ràng?
@Kipton_Barros: Vâng, tôi đã chọn Jean-Phillipe chỉ trả lời vì nó ngụ ý ít được tái cấu trúc với cơ sở mã hiện tại của tôi. – paradigmatic
@paradigmatic Vâng, câu trả lời của Jean-Philippe khá hay. Tôi thấy nó thú vị rằng mặc dù tham số 'FF' không phải là loại cao hơn, làm cho nó giúp suy luận. Tôi đã thử kỹ thuật của Jean-Philippe về một câu hỏi liên quan, nhưng không thể làm cho nó hoạt động cho đến nay: http://stackoverflow.com/questions/6892781/why-doesnt-scala-fully-infer-type-parameters-when- type-parameters-are-lồng nhau/6893057 # 6893057 –