且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

为什么Manifest在构造函数中不可用?

更新时间:2023-02-24 07:55:53

当语法糖从该上下文中移除时,它被重写为:

  class Foo [T] 
(val id:String = implicitly [Manifest [T]]。erasure.getName)
implicit ev $ 1:Manifest [T])= ...

当确定 id 的默认值时可用。我会这样写:

  class Foo [T:Manifest](id0:String =){
val id = if(id0!=)id0 else manifest [T] .erasure.getName
}






在你的第二种方法(这是一个很好的解决方案,顺便!),期望重写类似:



class Foo [T](val name:String)(implicit x $ 1:Manifest [T]){
def this :Manifest [T])= this(manifest [T] .erasure.getName)
}

是,在调用清单[T] .erasure


之前,清单

Consider this code:

class Foo[T : Manifest](val id: String = manifest[T].erasure.getName)

I basically want to store an identifier in Foo, which is often just the class name.

Subclass which do not need a special identifier could then easily use the default value.

But this doesn't even compile, the error message is:

error: No Manifest available for T.

Is there another approach which will work?

EDIT:

Why does this work if the manifest isn't available until the primary constructor?

class Foo[T: Manifest](val name: String) { 
  def this() = this(manifest[T].erasure.getName)
}

When the syntactic sugar is removed from that context bound, it gets rewritten as:

class Foo[T]
  (val id: String = implicitly[Manifest[T]].erasure.getName)
  (implicit ev$1: Manifest[T]) = ...

So the Manifest evidence simply isn't available when determining the default value of id. I'd instead write something like this:

class Foo[T : Manifest](id0: String = "") {
  val id = if (id0 != "") id0 else manifest[T].erasure.getName
}


In your second approach (which is a great solution, by the way!), expect a rewrite similar to:

class Foo[T](val name: String)(implicit x$1: Manifest[T]) { 
  def this()(implicit ev$2: Manifest[T]) = this(manifest[T].erasure.getName)
}

So yes, the manifest is available before the call to manifest[T].erasure