2016-12-29 61 views
0

很长一段时间我都试图避免隐式类,但最近我陷入了它。目前我无法弄清楚为什么我的函数aFunc2的返回类型无法转换为其隐式形式,因为它为aFunc1中的参数所做的操作。如何使用隐式类作为函数结果类型

object SO extends App { 
    implicit class Experiment[K, V](tpl: (K, V))(implicit o: Ordering[K], f: Fractional[V]) { 
    def foo(): String = "Bar" 
    } 

    // Works 
    println((12, 23.1).foo()) 

    // Works 
    def aFunc1[K, V](e: Experiment[K, V]): String = e.toString 
    println(aFunc1((12, 23.1))) 

    // does not - why ? 
    def aFunc2[K, V](e: Experiment[K, V]): Experiment[K, V] = (12, 23.1) 

} 

编辑1:其实这有做的类型,所以让我扩展示例一点点:

object SO extends App { 
    implicit class Experiment[K, V](tpl: (K, V))(implicit o: Ordering[K], f: Fractional[V]) { 
    def foo(): (K, V) = (tpl._1, tpl._2) 
    } 

    // Works 
    println((12, 23.1).foo()) 

    // Works 
    def aFunc1[K, V](e: Experiment[K, V]): String = e.toString 
    println(aFunc1((12, 23.1))) 

    // still does not but K and V should actually match - i guess 
    def aFunc2[K, V](e: Experiment[K, V]): Experiment[K, V] = e.foo() 

} 

错误:

Error:(19, 66) type mismatch; 
found : (K, V) 
required: scratch.SO.Experiment[K,V] 
    def aFunc2[K, V](e: Experiment[K, V]): Experiment[K, V] = e.foo() 

回答

1

这是一个有点很难猜出这个问题,而没有你得到的实际错误。您应该更新与错误消息的问题。

看着代码,我猜这个问题不是“隐式类”,而是你的类型不匹配的事实。

行:

def aFunc2[K, V](e: Experiment[K, V]): Experiment[K, V] = (12, 23.1) 

预计双方KV用你的方法的调用者指定Experiment[K,V]类型的返回值是。 你要返回的是一个(Int, Double)类型的元组,所以编译器会报错。

如果你想返回Experiment[Int, Double]那么你应该修改函数定义:

def aFunc2[K, V](e: Experiment[K, V]): Experiment[Int, Double] = (12, 23.1) 

UPDATE: 你可以尝试添加了KV隐含约束的aFunc2的定义是什么? 应该类似于此:

def aFunc2[K: Ordering, V: Fractional](e: Experiment[K, V]): Experiment[K, V] = e.foo() 

你要记住的是,为了一个元组(K,V)转换成你需要有范围(两个隐含值在K的顺序,一个Experiment[K, V]和小数欲诉)。

+0

是的,这是真的,它与类型有关,所以我稍微扩展了我的问题。 – KIC

+0

@KIC我已添加更新,您可以试试吗?我不得不承认,因为我现在没有正式的scala发布版本,所以我在这里瞎了眼。 –

+0

辉煌的作品 - thx! – KIC

相关问题