scala类型需要toString

时间:2016-07-07 19:19:19

标签: scala tostring type-bounds

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

我知道视图绑定要求对象可以“被视为”另一种类型,但这不起作用。

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

2 个答案:

答案 0 :(得分:3)

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

存在一个视图绑定,允许您拥有一个接受任何类型的函数,只要您希望希望类型存在隐式转换。为了展示真正意义上的东西,我打算让你的样品功能只是一个触动器。

首先,一些隐含的转化(我会坚持使用GetSingleProfilerResult(HttpContext context)Long来推动这一点回归)

Double

现在,这个函数真的想要在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 而不是T。不过你可以这样做。

String

答案 1 :(得分:2)

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

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

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

修改

如果不清楚 - 您也可以直接使用.toString - 此功能无用。