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
- 此功能将毫无用处。
关于您的编辑以及这些视图边界的用途。
存在一个视图绑定,允许您拥有一个接受任何类型的函数,只要存在对您希望您拥有的类型的隐式转换。为了展示它的真正含义,我将让您的示例函数更高级一些。
首先,一些隐式转换(我将坚持使用 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
不相当工作,但是,因为它实际上returns T
而不是String
。不过你可以这样做。
def func[T <% String](s: T): String = s
在 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
- 此功能将毫无用处。
关于您的编辑以及这些视图边界的用途。
存在一个视图绑定,允许您拥有一个接受任何类型的函数,只要存在对您希望您拥有的类型的隐式转换。为了展示它的真正含义,我将让您的示例函数更高级一些。
首先,一些隐式转换(我将坚持使用 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
不相当工作,但是,因为它实际上returns T
而不是String
。不过你可以这样做。
def func[T <% String](s: T): String = s