Scala:禁用默认的toString实现



我想创建一个case类,如果它与.toString()一起使用或至少在隐式字符串转换/插值中使用,则会触发编译时错误。到目前为止,我想到的最好的是:

abstract class Identifier {
  override def toString: String = throw new UnsupportedOperationException
}
case class AttrIdentifier(name: String) extends Identifier
val obj = new NamedIdentifier("foo")
// triggers runtime exception
s"$obj + bar"
"something" + obj

是否有办法禁用(即标记为私有,隐藏范围等)默认toString实现,所以它会触发编译时错误?

我为什么要这样做

我最初的目标是用更高级的实体(自定义类Identifier)替换应用程序中使用普通String实现的某些对象(标识符)。以前,使用基于字符串的标识符,如:

val outputStr = "public function $identifier()"

现在它应该被替换为几个IdentifierString函数中的一个(实际使用哪个需要在上下文中决定),例如:

val outputStr = "public function ${privateMemberName(identifier)}()"
val outputStr = "public function ${publicMemberName(identifier)}()"
val outputStr = "public function ${protectedMemberName(identifier)}()"

现在我想找到以前使用这个基于字符串的标识符来分析它们的所有地方,并将简单的字符串插值替换为这个IdentifierString函数调用。

您是否考虑过重新定义toString方法以指向另一个抽象方法,而不是试图禁用 toString?

您可以通过重写toString并将其设置为等于您的标识符方法来做到这一点,同时使标识符方法保持抽象。这里有一篇文章概述了Java中的方法。在Scala中这样做应该更简单。这将强制任何扩展trait或抽象类的类以你想要的方式实现toString。

最新更新