基于泛型特征的Scala隐式转换实现Java接口
几天来,我一直在研究一个关于隐式转换的问题,但不知何故,我就是不知道自己做错了什么。我通读了所有其他问题,以便处理隐含的问题,但我仍然不明白问题是什么基于泛型特征的Scala隐式转换实现Java接口,scala,generics,implicit-conversion,Scala,Generics,Implicit Conversion,几天来,我一直在研究一个关于隐式转换的问题,但不知何故,我就是不知道自己做错了什么。我通读了所有其他问题,以便处理隐含的问题,但我仍然不明白问题是什么 作为一个例子,让我们来考虑这样的java接口(t为简洁起见扩展对象): 但是,这也不会编译 2) 为什么编译在persist时失败,而在实际的方法调用(val Persister=Persister().persist(B()))时失败?这应该是第一个知道EntityType和DTOType的实际类型的地方,对吗 3) 有没有更好的方法来实现我的
作为一个例子,让我们来考虑这样的java接口(t为简洁起见扩展对象):
但是,这也不会编译 2) 为什么编译在persist
时失败,而在实际的方法调用(val Persister=Persister().persist(B())
)时失败?这应该是第一个知道EntityType和DTOType的实际类型的地方,对吗
3) 有没有更好的方法来实现我的目标?再说一遍,这不是我想做的实际事情,但已经足够接近了
如果这个问题不知道,请提前道歉,并提前感谢您的帮助。您需要在trait中提供转换。您不能从外部隐式地传递它,因为外部不知道
persist
秘密地需要realpsist
,这需要隐式转换。即使不考虑JPersistable
,这一切都会失败
例如,您可以添加
implicit def view: DTOType => EntityType
作为trait中的方法,然后它将编译。(您也可以删除realPersist
)
然后需要一种方法来设置该视图。你可以
case class Persister()(implicit val view: B => D) extends Persistable[B,D]
然后你们都很好。(隐式val
满足特征的隐式def
。)
但现在您有了更大的问题:Java接口签名与Scala签名不匹配。等效的Scala是
trait JPersistable[T <: Object] { def persist(t: T): T }
注意在哪里使用哪种类型!(谁取
B
和谁取D
以及您需要转换哪个方向?感谢您的快速回答Rex。仍然让我困惑的是,对于Predef隐式(如byte2short
),如果要使用转换,则不必指定抽象定义。我希望转换可以进行。。。嗯,含蓄地。特别是在我的问题1中,我希望scala在知道类型后能够解决转换问题。至少我希望,如果我在您的示例中将映射引入Persister
的范围,我就不必再次实现隐式def。对于我来说,我到底做错了什么仍然是一个谜…@LeChe-我已经更新了我的答案,使用“让外部隐式转换来做”的建议显示了一个有效的等价物。当然,我是一个白痴!为什么特质需要知道A-树,转换应该是完全透明的!妈的,我现在觉得自己很蠢。非常感谢你的解释。
implicit def view: DTOType => EntityType
case class Persister()(implicit val view: B => D) extends Persistable[B,D]
trait JPersistable[T <: Object] { def persist(t: T): T }
trait JPer[T] { def persist(t: T): T }
class A
case class B() extends A
class C
case class D() extends C
trait Per[Y <: C] extends JPer[Y] {
private def doIt(y: Y): Y = y
def persist(y: Y) = doIt(y)
}
case class Perer() extends Per[D] // "with JPer" wouldn't add anything!
object Maps { implicit def BtoD(b: B): D = D() }
object Test extends App {
import Maps._
val persisted = Perer().persist(B())
}