5

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?

+0

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 –

+0

Ouch ... Tôi hoàn toàn quên mất câu hỏi đó. : -/ – soc

+0

Nó vẫn là một câu hỏi hay. –

Trả lời

1

Nếu bạn đổi tên toán tử * thành ví dụ: mult rồi 1 mult (1 m) hoạt động trong cả hai trường hợp. Điều này không trả lời được câu hỏi của bạn nhưng có gợi ý theo hướng mà có lẽ có sự can thiệp nào đó với nhà điều hành quá tải nặng *.

Các vấn đề liên quan