在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
答案 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 <: Any
,T
都是正确的。
考虑到这一点,您可以完全删除T <: Any
(并将其替换为T
)。哎呀,REPL甚至为你简化了它:
scala> def func[T <: Any](s: T): String = s.toString
func: [T](s: T)String
如果不清楚 - 您也可以直接使用.toString
- 此功能无用。