默认情况下,如果存在适当的构造函数(并且未声明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
类的构造函数具有几个基本类型和几个对象类型(每个构造函数只接受一个参数)的构造方法。理想情况下,我想为他们所有人进行自动升级。
感谢。我真的不这么认为,因为我所有的搜索都没有发现。但我确实希望,因为它会使我所做的更好的语义。 – 2010-08-05 17:42:44
当你以你的名义作出假设时,你做不想做的事情也会容易得多。我曾在C++中工作过,当这样的事情发生严重错误时,我的头发被大部分拉掉了。 – 2010-08-05 21:29:27
艾伦,这绝对有可能。这就是为什么一些其他语言扭转了这种情况,并要求隐式构造函数被标记为这样。我的Java代码将充满someCall(new Foo(new Bar(someObject)));所以我希望避免它。 – 2010-08-06 21:13:56