有没有办法在Scala中应用或绑定类型?

有没有办法在Scala中应用或绑定类型?,scala,generics,types,Scala,Generics,Types,在Java中,我们只能对类型绑定应用和限制,如下所示: public class <T extends Serializable & SomeThingDoable> MyClass{ //... } 公共类MyClass{ //... } 但是我们不能告诉Java保持或限制 在Scala中是否可以提供一个限制,即可以将元素添加到集合iff中,它的类型是SomeType1或SomeType2在保证类型安全的情况下,您无法真正做到这一点 我的意思是,你可以只做一个实

在Java中,我们只能对类型绑定应用和限制,如下所示:

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
        ,这意味着您可以限制其他人向
        族添加更多实例(除非他们可以编辑在中定义的实际文件)
      • 一种类型良好的方法,用于指定在两种不同情况下希望实现的功能

      您打算稍后使用instanceof进行检查吗?@venpattern matchingokay,所以instanceof。工作,只要你知道类型erasure@Ven是的,我知道,但我想让编译器确保类型安全…你进行穷尽性检查吗?你打算稍后使用instanceof进行检查吗?@Ven pattern matchingokay,所以instanceof。工作,只要你知道类型erasure@Ven是的,我知道,但是我想要编译器确保类型安全…你做穷尽性检查吗?