繁体   English   中英

提取/推断scala类型

[英]extract/infer types of type scala

情况1:我的目标是在传递SampleClass类型时,getTypedOutput应该返回Result [Int]

trait SampleTrait[T]
trait Result[T]
class SampleClass extends SampleTrait[Int]

def getTypedOutput[C <: SampleTrait[T],T](clz : Class[C]) =
  "".asInstanceOf[Result[T]] // dummy implementation
// here I want result should be Result[Int] 
val out  = getTypedOutput(classOf[SampleClass])

上面的代码失败,并显示以下错误

error: inferred type arguments [SampleClass,Nothing] do not conform to
method getTypedOutput's type parameter bounds [C <: SampleTrait[T],T]
    val out  = getTypedOutput(classOf[SampleClass])
               ^
Main.scala:18: error: type mismatch;  found   : Class[SampleClass](classOf[ScalaJSExample$$main$SampleClass])  required: Class[C]
    val out  = getTypedOutput(classOf[SampleClass])

http://www.scala-js-fiddle.com/gist/593a55f0f6b0f44c2e70吗?

情况2:

trait Result[T]

class SampleClass extends SampleTrait[Int]

trait SampleTrait[T] {
  type ResultType = Result[T]
}

def getTypedOutput[C <: SampleTrait[_]](ctor: js.Dynamic): C#ResultType =
  "".asInstanceOf[C#ResultType]

错误2:

Main.scala:20: error: type mismatch;
 found   : Result[(some other)_$1(in type C)]
 required: Result[_$1(in type C)]
  def getTypedOutput[C <: SampleTrait[_]](ctor: js.Dynamic): C#ResultType = "".asInstanceOf[C#ResultType]

http://www.scala-js-fiddle.com/gist/593a55f0f6b0f44c2e70

以下类型检查:

trait SampleTrait[T]
trait Result[T]

class SampleClass extends SampleTrait[Int]

object Test {
  def getTypedOutput[T](clz: Class[_ <: SampleTrait[T]]): Result[T] =
    "".asInstanceOf[Result[T]] // dummy implementation

  def test(): Unit = {
    val out = getTypedOutput(classOf[SampleClass])
    val outCheck: Result[Int] = out
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM