首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Scala中,如何使用多个构造函数实现Java类的子类化?

在Scala中,如何使用多个构造函数实现Java类的子类化?
EN

Stack Overflow用户
提问于 2010-07-21 21:35:12
回答 3查看 10.4K关注 0票数 60

假设我有一个具有多个构造函数的Java类:

代码语言:javascript
复制
class Base {
    Base(int arg1) {...};
    Base(String arg2) {...};
    Base(double arg3) {...};
}

我如何在Scala中扩展它,同时仍然提供对Base的所有三个构造函数的访问?在Scala中,一个子类只能调用它的一个超类的构造函数。我该如何绕过这个规则呢?

假设Java类是我不能更改的遗留代码。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-07-21 21:40:02

很容易忘记一个特征可以扩展一个类。如果你使用一个特征,你可以推迟决定调用哪个构造函数,如下所示:

代码语言:javascript
复制
trait Extended extends Base {
  ...
}

object Extended {
  def apply(arg1: Int) = new Base(arg1) with Extended
  def apply(arg2: String) = new Base(arg2) with Extended
  def apply(arg3: Double) = new Base(arg3) with Extended
}

特征本身可能没有构造函数参数,但是你可以通过使用抽象成员来解决这个问题。

票数 93
EN

Stack Overflow用户

发布于 2010-07-21 21:36:35

我会选择最通用的一个(在本例中是String),如果它满足其他条件,则自己进行内部转换。

虽然我承认这不是最好的解决方案,但我觉得有些地方是错的。:-(

票数 2
EN

Stack Overflow用户

发布于 2010-07-21 21:59:15

这是一个愚蠢的答案,可能会有点用,但如果Java类有太多的构造函数,可能会太费力,但是:

用Java编写一个子类,实现一个构造函数,该构造函数接受其他各种构造函数的所有输入,并根据输入的存在与否调用其超类的正确构造函数(通过使用"null“或某种类型的标记值),然后在Scala中子类化该Java类,并将标记值指定为默认参数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3299776

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档