可以在Scala中编写类似于C模板的泛型返回类型吗?
发布时间:2020-12-16 18:46:05 所属栏目:安全 来源:网络整理
导读:在C中,我可以执行以下操作: templatetypename T,typename Vstruct{ void operator()(T _1,V _2){ _2.foo( _1 ); }}; 这让我随意决定使用任何有一些名为“foo”的方法的对象,它采用某种类型“T”,而不事先指定“foo”函数的参数类型和所述函数的返回类型. 当
在C中,我可以执行以下操作:
template<typename T,typename V> struct{ void operator()(T _1,V _2){ _2.foo( _1 ); } }; 这让我随意决定使用任何有一些名为“foo”的方法的对象,它采用某种类型“T”,而不事先指定“foo”函数的参数类型和所述函数的返回类型. 当我看到Scala时,看到像Function1这样的特征,并且正在使用像.这样的函数定义 def foo[T<:{def foo():Unit}]( arg:T ) = //something def bar( x:{def foo():Unit} ) = //something def baz[T,V<:Function1[T,_]]( x:T,y:V ) = y( x ) 我看着自己,想想为什么我不能做同样的事情?为什么“baz”会返回Any?它不能在编译时推断出实际的返回类型吗?如果我甚至不使用它,为什么我必须声明返回类型“foo”? 我希望能够做到 def biff[T,V:{def foo( x:T ):Unit}] = //something 要么 def boff[T<:{def foo( x:Double ):_}]( y:T ) = y.foo _ 你能做到这一点,我只是错过了一些东西吗?如果没有,为什么不呢? 解决方法
更新:
实际上,你可以做得更好,类型推断器将帮助你: def boff[T,R](y: T)(implicit e: T <:< {def foo(x: Double): R}) = e(y).foo _ 对于baz,相同的技术将改进类型推断: def baz[T,R,V]( x:T,y:V )(implicit e: V <:< (T => R)) = e(y).apply( x ) scala> baz(1,(i: Int) => i+1) res0: Int = 2 你可以通过currying做得更好: def baz[T,R](x: T)(f: T => R) = f(x) 第一解决方案 类型推断器不会为您提供T类型,但您可以这样做: class Boff[T] { def apply[R](y: T)(implicit e: T <:< {def foo(x: Double): R}) = e(y).foo _ } object boff { def apply[T] = new Boff[T] } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |