0

我有一个案例类:

case class AnomalyCheckConfigBuilder[S <: State[S]](anomalyDetectionStrategy: AnomalyDetectionStrategy,
                                                    analyzer: Analyzer[S, Metric[Double]],
                                                    anomalyCheckConfig: Option[AnomalyCheckConfig] = None)

我有一个函数,它以 Seq 的形式返回上述案例类对象的集合。

val anomalyCheckConfig : Seq[AnomalyCheckConfigBuilder[_]] = jobConfig.validate.get.getAnomalyCheckConfigBuilder

我将上面列表中的对象添加到另一个签名如下的方法中:

def addAnomalyCheck[S <: State[S]](
      anomalyDetectionStrategy: AnomalyDetectionStrategy,
      analyzer: Analyzer[S, Metric[Double]],
      anomalyCheckConfig: Option[AnomalyCheckConfig] = None)
    : this.type

我正在执行以下操作:

anomalyCheckConfig.foreach(x=>{
            verificationSuite = verificationSuite.addAnomalyCheck(x.anomalyDetectionStrategy,x.analyzer,x.anomalyCheckConfig)
          })

其中 verifySuite 是Deeque的开源代码

我在上面的代码中遇到的错误是:

error: inferred type arguments [_$1] do not conform to method addAnomalyCheck's type parameter bounds [S <: com.amazon.deequ.analyzers.State[S]]
[ERROR]             verificationSuite = verificationSuite.addAnomalyCheck(x.anomalyDetectionStrategy,x.analyzer,x.anomalyCheckConfig)

error: type mismatch;
[ERROR]  found   : com.amazon.deequ.analyzers.Analyzer[_$1,com.amazon.deequ.metrics.Metric[Double]]
[ERROR]  required: com.amazon.deequ.analyzers.Analyzer[S,com.amazon.deequ.metrics.Metric[Double]]
[ERROR]             verificationSuite = verificationSuite.addAnomalyCheck(x.anomalyDetectionStrategy,x.analyzer,x.anomalyCheckConfig)

代码在编译时失败,scala 无法理解状态,我无法理解_$1来自哪里。希望对此有一些意见

4

1 回答 1

1

这清楚地表明 Scala 需要您提供一个实例,'S'该实例是类的子类型State

你需要做的是:

anomalyCheckConfig.foreach(x=>{
            verificationSuite = verificationSuite.addAnomalyCheck[S](x.anomalyDetectionStrategy, x.analyzer.asInstanceOf[Analyzer[S, Metric[Double]]], x.anomalyCheckConfig)
          })

您还需要将其包装在一个接受S为子类型的函数下State

    def anmomaly[S <: State[S]](){
    
        anomalyCheckConfig.foreach(x=>{
                    verificationSuite = verificationSuite.addAnomalyCheck[S](x.anomalyDetectionStrategy, x.analyzer.asInstanceOf[Analyzer[S, Metric[Double]]], x.anomalyCheckConfig)
                  })
}
于 2022-03-01T10:56:25.227 回答