Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于泛型特征的Scala隐式转换实现Java接口_Scala_Generics_Implicit Conversion - Fatal编程技术网

基于泛型特征的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())
}