为什么可以';t我将一个trait传递给Scala函数并调用它:response[a:t](r:a)={r(value)}

为什么可以';t我将一个trait传递给Scala函数并调用它:response[a:t](r:a)={r(value)},scala,higher-order-functions,traits,Scala,Higher Order Functions,Traits,我正在尝试实现一个通用的响应函数,该函数接受一个Int和一个对象,然后在提供的对象上调用apply(e:Int)(将返回一个新实例)。以下是我目前掌握的情况: trait GPResponse { abstract def apply(error: Int) } trait GPResponseMapping { def response[A: GPResponse](error: Int, instance: A) = { (resultCodeFor(error), ins

我正在尝试实现一个通用的
响应
函数,该函数接受一个
Int
和一个对象,然后在提供的对象上调用
apply(e:Int)
(将返回一个新实例)。以下是我目前掌握的情况:

trait GPResponse {
    abstract def apply(error: Int)
}

trait GPResponseMapping {
    def response[A: GPResponse](error: Int, instance: A) = { (resultCodeFor(error), instance(error)) } // Make a tuple of code and GPResponse instance
    ...
这将生成以下编译器错误:

[error] GPResponseMapping.scala:68: utility.GPResponse does not take type parameters
[error]     def response[A: GPResponse](error: Int, instance: A) = { (resultCodeFor(error), instance(error)) }
[error]                   ^
[error] GPResponseMapping.scala:68: A does not take parameters
[error]     def response[A: GPResponse](error: Int, instance: A) = { (resultCodeFor(error), instance(error)) }
[error]                                                                                             ^
我要做的是从错误代码和响应对象实例的组合中创建元组。响应对象将错误代码作为构造函数参数(
apply()
argument),并返回一个实例。

编写此命令时:

def response[A: GPResponse](error: Int, instance: A) = {
编译器将其扩展为:

def response[A](error: Int, instance: A)(implicit $ev0 GPResponse[A]) = {
但是,由于您这样定义了
GPResponse

trait GPResponse {
它不接受类型参数,因此当您编写以下内容时,无法编写
a:GPResponse

def response[A: GPResponse](error: Int, instance: A) = {
编译器将其扩展为:

def response[A](error: Int, instance: A)(implicit $ev0 GPResponse[A]) = {
但是,由于您这样定义了
GPResponse

trait GPResponse {
它不接受类型参数,因此当您编写以下内容时,无法编写
a:GPResponse

def response[A: GPResponse](error: Int, instance: A) = {
编译器将其扩展为:

def response[A](error: Int, instance: A)(implicit $ev0 GPResponse[A]) = {
但是,由于您这样定义了
GPResponse

trait GPResponse {
它不接受类型参数,因此当您编写以下内容时,无法编写
a:GPResponse

def response[A: GPResponse](error: Int, instance: A) = {
编译器将其扩展为:

def response[A](error: Int, instance: A)(implicit $ev0 GPResponse[A]) = {
但是,由于您这样定义了
GPResponse

trait GPResponse {

它不接受类型参数,因此您无法编写
a:GPResponse

啊。。。好吧,算了。显然,我必须直接调用
apply()
方法,就像在
实例中一样。apply(…)
这有点令人吃惊,但它可以工作:

trait GPResponse {
    abstract def apply(error: GPError): GPResponse
}

trait GPResponseMapping {
    def response(error: Int, instance: GPResponse) = { (resultCodeFor(error), instance.apply(error)) }
    ...

如果有人能解释为什么我不能在本文中使用
instance(error)
,我将不胜感激。谢谢大家!

啊。。。好吧,算了。显然,我必须直接调用
apply()
方法,就像在
实例中一样。apply(…)
这有点令人吃惊,但它可以工作:

trait GPResponse {
    abstract def apply(error: GPError): GPResponse
}

trait GPResponseMapping {
    def response(error: Int, instance: GPResponse) = { (resultCodeFor(error), instance.apply(error)) }
    ...

如果有人能解释为什么我不能在本文中使用
instance(error)
,我将不胜感激。谢谢大家!

啊。。。好吧,算了。显然,我必须直接调用
apply()
方法,就像在
实例中一样。apply(…)
这有点令人吃惊,但它可以工作:

trait GPResponse {
    abstract def apply(error: GPError): GPResponse
}

trait GPResponseMapping {
    def response(error: Int, instance: GPResponse) = { (resultCodeFor(error), instance.apply(error)) }
    ...

如果有人能解释为什么我不能在本文中使用
instance(error)
,我将不胜感激。谢谢大家!

啊。。。好吧,算了。显然,我必须直接调用
apply()
方法,就像在
实例中一样。apply(…)
这有点令人吃惊,但它可以工作:

trait GPResponse {
    abstract def apply(error: GPError): GPResponse
}

trait GPResponseMapping {
    def response(error: Int, instance: GPResponse) = { (resultCodeFor(error), instance.apply(error)) }
    ...

如果有人能解释为什么我不能在本文中使用
instance(error)
,我将不胜感激。谢谢大家!

那么我想做的是不可能的吗?我开始的时候很简单:
def-response(error:Int,instance:GPResponse)={(resultCodeFor(error),instance(GPError.errorForCode(error))}
,但这会导致
apply():Unit
没有定义,我无法回避这个问题……那么我试图做的事情是不可能的吗?我开始的时候很简单:
def-response(error:Int,instance:GPResponse)={(resultCodeFor(error),instance(GPError.errorForCode(error))}
,但这会导致
apply():Unit
没有定义,我无法回避这个问题……那么我试图做的事情是不可能的吗?我开始的时候很简单:
def-response(error:Int,instance:GPResponse)={(resultCodeFor(error),instance(GPError.errorForCode(error))}
,但这会导致
apply():Unit
没有定义,我无法回避这个问题……那么我试图做的事情是不可能的吗?我一开始只是:
def-response(error:Int,instance:GPResponse)={(resultCodeFor(error),instance(GPError.errorForCode(error))}
,但这会导致
apply():Unit
没有定义,我无法回避这个问题……
instance(error)
应该没问题——当你尝试这个的时候会出什么问题?原始问题中的错误是关于
[A:GPResponse]
,而不是关于
实例(错误)
实例(错误)
是一个编译时错误,但是调用
实例。apply(错误)
工作正常。我试图用类型参数来解决这个问题。。。但是,
instance.apply(error)
对我很有效。
instance(error)
应该可以-当你尝试时,会出现什么问题?原始问题中的错误是关于
[A:GPResponse]
,而不是关于
实例(错误)
实例(错误)
是一个编译时错误,但是调用
实例。apply(错误)
工作正常。我试图用类型参数来解决这个问题。。。但是,
instance.apply(error)
对我很有效。
instance(error)
应该可以-当你尝试时,会出现什么问题?原始问题中的错误是关于
[A:GPResponse]
,而不是关于
实例(错误)
实例(错误)
是一个编译时错误,但是调用
实例。apply(错误)
工作正常。我试图用类型参数来解决这个问题。。。但是,
instance.apply(error)
对我很有效。
instance(error)
应该可以-当你尝试时,会出现什么问题?原始问题中的错误是关于
[A:GPResponse]
,而不是关于
实例(错误)
实例(错误)
是一个编译时错误,但是调用
实例。apply(错误)
工作正常。我试图用类型参数来解决这个问题。。。但是
instance.apply(error)
适合我。