【问题标题】:Can I create a non-explicit constructor for a Java class?我可以为 Java 类创建非显式构造函数吗?
【发布时间】:2011-11-03 00:49:05
【问题描述】:

默认情况下,如果存在适当的构造函数(并且未声明 explicit),C++ 将在赋值中执行“自动提升”。

在 Java 中,默认情况下不会发生这种行为。如果我想要自动提升,有没有办法将我的构造函数声明为隐式?

例如,下面是一些具有我想要的效果的 C++ 代码:

class Foo {
    public:
        Foo(string) { /* ... */ }
        /* Foo's methods and stuff */
};

void DoSomethingWithAFoo(Foo foo)
{
    /* ... */
}

int main()
{
    string s = "I am a happy string, I swear!";

    DoSomethingWithAFoo(s);    

    return 0;
}

通常,在 C++ 中这是允许的,并且string s 将被自动提升(通过从s 构造一个临时的Foo)。
由于Foo(string) 构造函数没有被标记为显式,我什至不需要类型转换。

有没有办法在 Java 中做到这一点?

我之所以这么问,是因为我正在尝试创建一种特定类型,它代表特定种类的其他类型中的任何一种。例如,想象一个class Primitive 表示单个布尔值、整数、字符或双精度(这不是我的具体示例,但它是相关的)。

我的系统中期望 Primitive 的方法也应该接受 Primitive 可能表示的任何“真实类型”(通过构造函数调用自动提升到 Primitive 类型的匿名对象)。

在我的实际工作中(与本示例相反),我的等效于 Primitive 类的构造函数既来自几个原始类型,也来自几个对象类型(每个构造函数只接受一个参数)。理想情况下,我希望为所有这些人提供自动促销。

【问题讨论】:

    标签: java


    【解决方案1】:

    没有。 Java 没有隐式构造函数。

    【讨论】:

    • 谢谢。我不这么认为,真的,因为我所有的搜索都没有结果。但我确实希望,因为它会使我所做的事情的语义更好。
    • 当它代表你做出假设时,做你不想做的事情也容易得多。我曾在 C++ 中工作过,当这样的事情发生严重错误时,我的头发都掉光了。
    • 艾伦,这绝对是可能的。这就是为什么其他一些语言扭转了这种情况并要求将隐式构造函数标记为这样的原因。但是,就我而言,我的 Java 代码将充满 someCall(new Foo(new Bar(someObject)));所以我希望避免它。
    【解决方案2】:

    不,你需要明确地构造它:

     DoSomethingWithAFoo(new Foo(s));     
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 2017-11-13
      • 1970-01-01
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 2020-03-08
      相关资源
      最近更新 更多