2010-08-05 93 views
0

默认情况下,如果存在适当的构造函数(并且未声明explicit),C++将在赋值中执行“自动升级”。我可以为Java类创建非显式构造函数吗?

在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类的构造函数具有几个基本类型和几个对象类型(每个构造函数只接受一个参数)的构造方法。理想情况下,我想为他们所有人进行自动升级。

回答

1

否。Java没有隐含的构造函数。

+0

感谢。我真的不这么认为,因为我所有的搜索都没有发现。但我确实希望,因为它会使我所做的更好的语义。 – 2010-08-05 17:42:44

+1

当你以你的名义作出假设时,你做不想做的事情也会容易得多。我曾在C++中工作过,当这样的事情发生严重错误时,我的头发被大部分拉掉了。 – 2010-08-05 21:29:27

+0

艾伦,这绝对有可能。这就是为什么一些其他语言扭转了这种情况,并要求隐式构造函数被标记为这样。我的Java代码将充满someCall(new Foo(new Bar(someObject)));所以我希望避免它。 – 2010-08-06 21:13:56

0

没有,你需要明确地构造它:

DoSomethingWithAFoo(new Foo(s));  
相关问题