【问题标题】:Scala typing: "Expected _$1, got T"Scala 输入:“预期 _$1,得到 T”
【发布时间】:2014-08-13 19:32:43
【问题描述】:

我有一个包含混合 Java-Scala 代码的 Lift 项目。该项目有一个使用 EclipseLink 用 Ja​​va 编写的 JPA 后端,由使用 Lift 和 Lift-NG 的 Scala 端访问。

在Java方面,我有以下相关接口:

interface IEntity

interface IDAO<T extends IEntity> {
    void persist(T t);
}

在 Scala 方面,我有以下内容:

abstract class Binding[T <: IEntity] extends NgModel {
    def unbind: T
}

class BasicService[B <: Binding[_ <: IEntity]](serviceName: String, dataAccessObject: IDAO[_ <: IEntity]) {
    def persist(binding : B): Unit = {
        val entity = binding.unbind
        dataAccessObject.persist(entity)
    }
}

这个层次结构的目的是让我创建服务实例来处理实体 E 的给定绑定,它还可以接收和使用为处理类型 E 而创建的适当 DAO。例如:

// Java side
class Todo implements IEntity

class TodoManager implements IDAO<Todo>

// Scala side
case class TodoBinding extends Binding[Todo] {
    override def unbind: Todo = new Todo()
}
object HelloWorld extends BasicService[TodoBinding]("todoService", new TodoManager) 

我的问题是BasicService的persist方法内部发生的编译错误。在最后一行,我明白了:

Type mismatch: expected _$1, actual: IEntity

由于我对 Scala 有点缺乏经验,我可能会遗漏类型系统中非常明显的一些东西,但我真的无法弄清楚这一点。如何解决此错误?

【问题讨论】:

    标签: scala generics


    【解决方案1】:

    您对BasicService 的定义不需要B 的类型参数:

    B <: Binding[_ <: IEntity]
    

    dataAccessObject的类型参数兼容:

    dataAccessObject: IDAO[_ <: IEntity]
    

    如果一个是Binding[FooEntity] 而另一个是IDAO[BarEntity] 怎么办?

    您应该使用您说要使用的类型变量E,并实际定义它:

    class BasicService[E <: IEntity, B <: Binding[E]]
                      (serviceName: String, dataAccessObject: IDAO[E])
    

    还请注意,在您发布的示例代码中,类型变量 BBasicService 可能不是必需的,因为您只使用它来接收参数 bindingpersist()。你可以简单地使用 Binding[E] 类型:

    class BasicService[E <: IEntity]
                      (serviceName: String, dataAccessObject: IDAO[E]) {
      def persist(binding: Binding[E]): Unit = // ...
    }
    

    【讨论】:

    • 谢谢,这确实解决了问题。我现在收到另一个错误(“B 没有可用的清单”),但它似乎超出了这个问题的范围,因为它发生在我上面没有提到的方法中。如有必要,我会提出一个新问题,并按原样接受您的回答。
    • 新问题来了,供参考:stackoverflow.com/questions/25285865/…
    猜你喜欢
    • 2022-11-17
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 1970-01-01
    • 2020-11-07
    • 2021-09-26
    • 2021-07-31
    相关资源
    最近更新 更多