【问题标题】:How can I pass an parameter to a method of an existential type?如何将参数传递给存在类型的方法?
【发布时间】:2015-08-13 01:57:09
【问题描述】:

Scala 代码:

class AAA[T] {
  def hhh(t: T) = println(t)
}

val a: AAA[_] = new AAA()

我可以将什么传递给a.hhh?我试过了:

val b: Any = 111
a.hhh(b) // compilation error!

但它有编译错误。如果第一部分代码无法更改,如何使第二部分可编译?

【问题讨论】:

  • 简答:你不能。
  • 可能是a.asInstanceOf[AAA[Int]].hhh(111)?

标签: scala existential-type


【解决方案1】:

你所能做的就是把它包装成这样的东西:

def ggg[T](t: T)= a.asInstanceOf[AAA[T]].hhh(t)

ggg(111) // prints 111

【讨论】:

    【解决方案2】:

    好吧,给定一个未知类型TAAA[T],你需要一个T。为什么val b: Any = 111 不起作用应该很明显:因为T 可以是任何它可以是例如String

    所以要传递一些东西,它必须同时拥有所有可能的类型T,因此它只能拥有一种类型:Nothing

    val b: Nothing = throw new Exception
    a.hhh(b) // compiles! 
    

    对于这个hhh 签名,这总是会抛出异常,因为没有Nothing 类型的实际值。但是你可以通过修改它得到更合理的东西:例如按名称取参数,取List[T](在这种情况下可以传递Nil)等。

    【讨论】:

      猜你喜欢
      • 2010-11-15
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      • 2021-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      相关资源
      最近更新 更多