有没有办法在Scala中应用或绑定类型?
在Java中,我们只能对类型绑定应用和限制,如下所示:有没有办法在Scala中应用或绑定类型?,scala,generics,types,Scala,Generics,Types,在Java中,我们只能对类型绑定应用和限制,如下所示: public class <T extends Serializable & SomeThingDoable> MyClass{ //... } 公共类MyClass{ //... } 但是我们不能告诉Java保持或限制 在Scala中是否可以提供一个限制,即可以将元素添加到集合iff中,它的类型是SomeType1或SomeType2在保证类型安全的情况下,您无法真正做到这一点 我的意思是,你可以只做一个实
public class <T extends Serializable & SomeThingDoable> MyClass{
//...
}
公共类MyClass{
//...
}
但是我们不能告诉Java保持或限制
在Scala中是否可以提供一个限制,即可以将元素添加到集合iff中,它的类型是
SomeType1
或SomeType2
在保证类型安全的情况下,您无法真正做到这一点
我的意思是,你可以只做一个实例
,然后在类被实例化时抛出一个错误,但那是相当肮脏的
更好的解决方案是使用ADT(抽象数据类型):
这将进行穷尽性检查:
<console>:16: warning: match may not be exhaustive.
:16:警告:匹配可能并不详尽。
如果要保证类型安全,就不能真正做到这一点
我的意思是,你可以只做一个实例
,然后在类被实例化时抛出一个错误,但那是相当肮脏的
更好的解决方案是使用ADT(抽象数据类型):
这将进行穷尽性检查:
<console>:16: warning: match may not be exhaustive.
:16:警告:匹配可能并不详尽。
我建议使用
还要注意,Dotty对类型有和/或内置的限制。我建议使用
还请注意,Dotty将对类型具有和/或内置限制。没有语言级别的构造完全支持这一点,但正如@dveim所指出的,我相信这很快就会出现 如果您是在考虑一个特定的实际用例,那么您确实有一些选择。您可以使用
或[SomeType1,SomeType2]
,其中包含表示此想法所需的所有构造(但不是类型绑定)
或者,您可以使用TypeClass实现此效果:
sealed trait Or[T] {
def someMethod(t: T): String
}
object Or {
implicit object OrInt extends Or[Int] {
def someMethod(t: Int): String = "int"
}
implicit object OrLong extends Or[Long] {
def someMethod(t: Long): String = "long"
}
}
object Test {
import Or._
def test[T](value: T)(implicit or: Or[T]): String =
or.someMethod(value)
}
请原谅这个微不足道的例子,但你在这里得到的是:
- a
,这意味着您可以限制其他人向sealed trait
族添加更多实例(除非他们可以编辑在中定义的实际文件)或
- 一种类型良好的方法,用于指定在两种不同情况下希望实现的功能
- 没有语言级别的结构能够准确地支持这一点,但正如@dveim所指出的,我相信这很快就会到来
如果您是在考虑一个特定的实际用例,那么您确实有一些选择。您可以使用
或[SomeType1,SomeType2]
,其中包含表示此想法所需的所有构造(但不是类型绑定)
或者,您可以使用TypeClass实现此效果:
sealed trait Or[T] {
def someMethod(t: T): String
}
object Or {
implicit object OrInt extends Or[Int] {
def someMethod(t: Int): String = "int"
}
implicit object OrLong extends Or[Long] {
def someMethod(t: Long): String = "long"
}
}
object Test {
import Or._
def test[T](value: T)(implicit or: Or[T]): String =
or.someMethod(value)
}
请原谅这个微不足道的例子,但你在这里得到的是:
- a
,这意味着您可以限制其他人向sealed trait
族添加更多实例(除非他们可以编辑在中定义的实际文件)或
- 一种类型良好的方法,用于指定在两种不同情况下希望实现的功能