scala 类型需要 toString

scala type requires toString

在 Scala 中,要求类型可以被视为字符串的最通用的方法是什么?

我知道视图绑定要求对象可以是 "viewed as" 另一种类型,但这行不通。

def func[T <% String](s: T): String = s.toString

val x: Long = 0

x.toString // String = 0
func(x)    // error: No implicit view available from Long => String.

Type Any 有一个 toString 方法...所以我可以做一个类型绑定...但是 Scala 中的每个对象都自动成为 Any 的子类型吗?似乎有可能,但出于某种我没有预料到的原因,这是愚蠢的吗?

def func[T <: Any](s: T): String = s.toString

class A { override def toString "xxx" }
func(new A) // String = xxx

class B(val b: Int) 
func(new B(0)) // String = B@12345678

object C { override def toString = "ccc" }
func(C) // String = ccc

所以它似乎有效,即使我的对象没有明确扩展 Any 的任何子类。这是否会推广到 Scala 中的任何对象,即使它不一定以看起来像我想要的漂亮字符串结束?

编辑

根据下面的评论,作为字符串查看和创建新字符串是不同的。在这种情况下,我不在乎,但要使视图绑定版本工作...我猜这样的事情会合适吗?

implicit def strConv[T](s: T) = s.toString

def func[T <% String](s: T) = s

func(new A) // A = xxx

是的,它将始终有效:Any 是层次结构中的最高层。查看 diagram。看起来它概括了 Scala 的值类型 (AnyVal) 和引用类型 (AnyRef)。因此,T <: Any 对任何 T.

都为真

考虑到这一点,您可以完全删除 T <: Any(并仅用 T 替换它)。哎呀,REPL 甚至为您简化了它:

scala> def func[T <: Any](s: T): String = s.toString
func: [T](s: T)String

编辑

如果不清楚 - 您不妨直接使用 .toString - 此功能将毫无用处。

关于您的编辑以及这些视图边界的用途。

存在一个视图绑定,允许您拥有一个接受任何类型的函数,只要存在对您希望您拥有的类型的隐式转换。为了展示它的真正含义,我将让您的示例函数更高级一些。

首先,一些隐式转换(我将坚持使用 LongDouble 来说明重点)

implicit def long2String(l: Long) = l.toString
implicit def double2String(d: Double) = d.toString

现在,一个真正想要在 Strings 上运行但会接受任何可转换为 String

的函数
def func[T <% String](s: T) = s.substring(0,2)

现在,如果我用 Double 调用该函数,我会得到这个

scala> func(9.123)
res8: String = 9.

还有 Long

scala> func(999999L)
res7: String = 99

但是 Int

scala> func(99)
<console>:15: error: No implicit view available from Int => String.
   func(99)

你的具体例子

def func[T <% String](s: T) = s

相当工作,但是,因为它实际上returns T而不是String。不过你可以这样做。

def func[T <% String](s: T): String = s