2016-06-23 3 views
3

Я хочу использовать класс типа для разработки интерфейса новообращенного и коды, как показано ниже:несколько параметров типа в тип класса

case class Kilograms(value: Double) 

case class Pounds(value: Double) 

trait Convert[T, U] { 
    def convert(input: T): U 
} 

object Convert { 
    def apply[T:Convert, U:Convert] = implicitly[Convert[T,U]] 
    def covert[T, U](input: T)(implicit c: Convert[T, U]): U = c.convert(input) 

    implicit object kilogramsToPounds extends Convert[Kilograms, Pounds] { 
     override def convert(input: Kilograms): Pounds = Pounds(input.value * 2.20462) 
    } 

    implicit object poundsToKilograms extends Convert[Pounds, Kilograms] { 
     override def convert(input: Pounds): Kilograms = Kilograms(input.value/2.20462) 
    } 
} 

Но компиляции ошибка:

Error: wrong number of type arguments for A$A95.this.Convert, should be 2 
def apply[T:Convert, U:Convert] = implicitly[Convert[T,U]] 

Error: could not find implicit value for parameter e: A$A95.this.Convert[T,U] 
    def apply[T:Convert, U:Convert] = implicitly[Convert[T,U]] 

Error: not enough arguments for method implicitly: (implicit e: A$A95.this.Convert[T,U])A$A95.this.Convert[T,U]. 
Unspecified value parameter e. 
    def apply[T:Convert, U:Convert] = implicitly[Convert[T,U]] 

Если изменить def apply[T:Convert, U:Convert] = implicitly[Convert[T,U]] в def apply[T, U](implicit c: Convert[T, U]): Convert[T, U] = c, нет ошибки компиляции !!!

Я хотел бы знать, что происходит? Кроме того, я просматриваю некоторую информацию, ограничение контекста ограничено параметром одиночного типа (?) Если я хочу реализовать несколько типов типа типа, как мне это сделать?

ответ

5

Контекст переплете синтаксис T : U работает только для типов U, которые имеют только один параметр типаS (который соответствует T).

Это справедливо, потому что вы вручную объявляя неявный для Convert[T, U]:

def covert[T, U](input: T)(implicit c: Convert[T, U]): U = c.convert(input) 

Следующий не действует, так как компилятор де-сахара контекст ограничивает для Convert[T] и Convert[U] соответственно, что не делает смысл.

def apply[T:Convert, U:Convert] = implicitly[Convert[T,U]] 

(попытки де-сахара в)

def apply[T, U](implicit ev1: Convert[T], ev2: Convert[U]) = ... 

Смотрите SLS 7.4 - Context and View Bounds:

A type parameter A of a method or non-trait class may also have one or more context bounds A : T . In this case the type parameter may be instantiated to any type S for which evidence exists at the instantiation point that S satisfies the bound T . Such evidence consists of an implicit value with type T[S] .

Смежные вопросы