假设我有一个以下列方式定义的函数:
def fun[T](somevar: SomeType[T]) = {
// some action
}
有没有办法git摆脱类型参数[T]
,只是将其用作
def fun(somevar: SomeType[T]) = {
// some action
}
我的意思是,类型信息应该已经在someVar
内可用,不是吗?为什么不以某种方式使用它们?
答案 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
}