1

我在这里使用由亚马逊在 scala 中编写的库

特征是这样的:

trait Analyzer[S <: State[_], +M <: Metric[_]]

我正在尝试制作一个案例对象来存储一些信息,而上述分析器的一个实例就是其中的一部分。

case class AnomalyCheckConfigBuilder(anomalyDetectionStrategy: AnomalyDetectionStrategy,
                                     analyzer: Analyzer[_, Metric[_]],
                                     anomalyCheckConfig: Option[AnomalyCheckConfig] = None)

我收到以下错误:

error: type arguments [_$1,com.amazon.deequ.metrics.Metric[_]] do not conform to trait Analyzer's type parameter bounds [S <: com.amazon.deequ.analyzers.State[_],+M <: com.amazon.deequ.metrics.Metric[_]]
       case class AnomalyCheckConfigBuilder(anomalyDetectionStrategy: AnomalyDetectionStrategy,

不确定,这里有什么问题。有人明白这个吗?

4

1 回答 1

2

问题是,如果您查看Statetrait 的定义,您会看到trait State[S <: State[S]]State 类型参数(名为 S)中的类型,必须是该类型的 State 的子类型,例如:trait MyState extends State[MyState]. 但是在中使用下划线analyzer: Analyzer[_(this one), Metric[_]]并不能保证编译器该类型扩展了该类型的 State。要使编译错误消失,您可以执行以下操作:

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

这是较短的形式

case class AnomalyCheckConfigBuilder[StateType <: State[_]](anomalyDetectionStrategy: AnomalyDetectionStrategy,
                                     analyzer: Analyzer[StateType, Metric[_]],
                                     anomalyCheckConfig: Option[AnomalyCheckConfig] = None)
于 2022-01-21T00:22:05.560 回答