Hãy xem xét đoạn mã đơn giản hóa này của một số đơn vị chức năng đo lường trong Scala:Tại sao tìm kiếm tiềm ẩn bị ảnh hưởng bởi thông số loại không liên quan?
object UnitsEx {
case class Quantity[M <: MInt, T: Numeric](value: T) {
private val num = implicitly[Numeric[T]]
def *[M2 <: MInt](m: Quantity[M2, T]) =
Quantity[M, T](num.times(value, m.value))
}
implicit def measure[T: Numeric](v: T): Quantity[_0, T] = Quantity[_0, T](v)
implicit def numericToQuantity[T: Numeric](v: T): QuantityConstructor[T] =
new QuantityConstructor[T](v)
class QuantityConstructor[T: Numeric](v: T) {
def m = Quantity[_1, T](v)
}
sealed trait MInt
final class _0 extends MInt
final class _1 extends MInt
}
đoạn này cho thấy việc sử dụng và lỗi biên dịch Tôi hiện có:
import UnitsEx._
(1 m) * 1 // Works
1 * (1 m) // Doesn't work:
/*
<console>:1: error: overloaded method value * with alternatives:
(x: Double)Double <and>
(x: Float)Float <and>
(x: Long)Long <and>
(x: Int)Int <and>
(x: Char)Int <and>
(x: Short)Int <and>
(x: Byte)Int
cannot be applied to (UnitsEx.Quantity[UnitsEx._1,Int])
1 * (1 m)
^
*/
Bao bì các 1
với measure
sẽ sửa chữa vấn đề, nhưng tại sao không phải là tiềm ẩn trong phạm vi áp dụng?
Nếu tôi loại bỏ các tham số kiểu M
như trong đoạn mã sau nó bắt đầu làm việc, mặc dù tôi không thể nhìn thấy làm thế nào mà tham số loại có liên quan đến tìm kiếm ngầm:
object UnitsEx2 {
case class Quantity[T: Numeric](value: T) {
private val num = implicitly[Numeric[T]]
def *(m: Quantity[T]) = Quantity[T](num.times(value, m.value))
}
implicit def measure[T: Numeric](v: T): Quantity[T] = Quantity[T](v)
implicit def numericToQuantity[T: Numeric](v: T): QuantityConstructor[T] =
new QuantityConstructor[T](v)
class QuantityConstructor[T: Numeric](v: T) {
def m = Quantity[T](v)
}
}
là dự kiến này hoặc hạn chế đã biết của trình kiểm tra loại?
Câu hỏi tương tự chưa được trả lời đầy đủ: http://stackoverflow.com/questions/7649517/why-is-the-implicit-conversion-not-considered-in-this-case-with-generic-paramete/ 7650605 # 7650605 –
Ouch ... Tôi hoàn toàn quên mất câu hỏi đó. : -/ – soc
Nó vẫn là một câu hỏi hay. –