考虑以下类:
class Type { def +(other:Type):Type = this}
class SubType extends Type
现在我想创建一个包装器对象,它接受一个二进制函数Type
或其派生类型,让我们从:
case class Fct(f:(Type,Type) => Type)
Fct
我可以使用apply 方法实例化该类_+_
,但我无法使用Subtype
该类传递函数,这是预期的:
val f1 = Fct(_+_) // OK
val f2 = Fct((x:SubType,y:Type) => y) // error: found: (SubType, Type) => Type, required: (Type, Type) => Type
现在我们可以定义Fct
使用泛型和类型边界来接受子类型:
case class Fct[T <: Type, U <: Type, V <: Type](f:(T,U) => V)
现在f2
按预期工作,但f1
不再有效,我不明白为什么:
val f1 = Fct(_+_) // error: missing parameter type
val f2 = Fct((x:SubType,y:Type) => y) // OK
是否有可以同时接受f1
and的语法f2
?
编辑
(回复 mz)有没有办法解决工厂的差异问题?就像是:
class Fct(f:(Type,Type) => Type)
object Fct {
def apply(f:(Type,Type) => Type): Fct = new Fct(f)
def apply[T <: Type, U <: Type, V <: Type](f:(T,U) => V): Fct =
new Fct((x:Type,y:Type) => {(x,y) match {
case (a:T, b:U) => f(a,b)
case _ => ???
}}: Type)
}