Scala:摆脱函数中的类型参数

时间:2016-04-18 18:40:15

标签: scala

假设我有一个以下列方式定义的函数:

def fun[T](somevar: SomeType[T]) = { 
   // some action 
}

有没有办法git摆脱类型参数[T],只是将其用作

def fun(somevar: SomeType[T]) = { 
   // some action 
}

我的意思是,类型信息应该已经在someVar内可用,不是吗?为什么不以某种方式使用它们?

4 个答案:

答案 0 :(得分:3)

你的问题的目的不明确。

您的功能用户(客户端代码)不必担心类型参数。他们只需拨打fun(myvar)

如果T类型对fun()的主体不重要,则可以将其删除:SomeType[_]

但如果T对函数的工作有意义,则必须告诉编译器它是一个类型参数。刚看到这个SomeType[T],编译器就无法推断T现在是一个类型参数。相反,它会在T之外寻找fun()的定义,并且找不到它会引发错误。

答案 1 :(得分:2)

这会有问题,因为您要删除的内容实际上并不是多余的。当函数定义为def fun[T](...)时,T被定义为新类型变量。否则,它引用在其他地方定义的类型或类型变量。你似乎认为

def fun(somevar: SomeType[T]) { ... }

应该表示T是一个新类型变量。但总是这样吗?不在此代码中:

trait T { ... }
def fun(somevar: SomeType[T]) { ... }

那么我们从那里去哪里?每当引用之前未定义的类型名称时,定义新的类型变量?这将使以下编译时错误变得非常奇怪。 (或者更糟糕的是,有时允许他们编译?)

def fun(somevar: SomeType[Integr]) { ... }

class C[Thing] {
  def g(x: List[Think]) = ...
}

对于Scala的编译时类型检查哲学,这种方式就是疯狂。

答案 2 :(得分:1)

除非您希望T成为特定类型,否则不会。如果没有它,方法签名将无效。 somevar知道什么是无关紧要的。

答案 3 :(得分:0)

你不能这样做。编译器需要知道什么是类型T。如果您不关心SomeType类型参数,可以使用以下表单:

def fun(somevar: SomeType[_]) = { 
   // some action 
}