加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

可以在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]
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读