加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 替代构造函数中的固定类型参数

发布时间:2020-12-16 10:04:29 所属栏目:安全 来源:网络整理
导读:可以这样做吗? final case class C[A] (v: A) { def this() = this(true)} 当使用给定的构造函数构造时,C自动为C [Boolean].这个版本没有编译,但感觉它应该是可行的,特别是因为以下似乎工作: final case class C[A] (v: A = true) 我想要一些Java互操作性,
可以这样做吗?

final case class C[A] (v: A) {
  def this() = this(true)
}

当使用给定的构造函数构造时,C自动为C [Boolean].这个版本没有编译,但感觉它应该是可行的,特别是因为以下似乎工作:

final case class C[A] (v: A = true)

我想要一些Java互操作性,所以我尽量避免使用默认值.我认为我可以通过在伴随对象中使用工厂方法来实现这一点,但它可以直接完成吗?由于C是一个案例类,工厂方法有点凌乱恕我直言.

解决方法

我怀疑伴侣物体中的工厂方法是你能做的最好的(正如小麦所建议的那样).我们可以编译它,但是以牺牲愚蠢为代价.例如:

final case class C[A] (v: A) {
  def this() = this("Hello".asInstanceOf[A]) // Compiles,thanks to type erasure
}

val c = new C[Int]() // Still compiles,despite the fact that "Hello" is not an Int
println(c) // C(Hello)
c.v + 1 // Compiles,but throws a ClassCastException at run-time

基本问题是类参数是在类级别而不是构造函数级别指定的,因此所有构造函数都必须使用相同的类型参数.另一方面,方法可以采用类型参数,因此工厂方法没有问题.此外,工厂方法的Java Interop并不是那么糟糕.你可以这样做:

// C.scala
final case class C[A] (v: A) 
object C {
    def apply(): C[Boolean] = C(true)
}

// Test.java
public class Test {
    public C c = C.apply();
}

scala编译器创建静态方法来简化Java互操作,因此通常不需要使用C $.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读