我正在做研究,其中我发现了以下内容:
假设我有一个类如下所示的类,具有以下构造函数:
public class Triangle implements Shape {
public String type;
public String height;
public Triangle(String type) {
super();
this.type = type;
}
public Triangle(String height) {
super();
this.height = height;
}
public Triangle(String type, String height) {
super();
this.type = type;
this.height = height;
}
}
这给了我一个编译时错误。但是,如果我将height
从String
更改为int
,一切正常。以下是更改的代码:
public class Triangle implements Shape {
public String type;
public int height;
public Triangle(String type) {
super();
this.type = type;
}
public Triangle(int height) {
super();
this.height = height;
}
public Triangle(String type, int height) {
super();
this.type = type;
this.height = height;
}
}
现在问题是:假设我希望String
为height
,就像我的第一个案例一样;为什么失败了?请解释一下。
答案 0 :(得分:9)
不允许重载具有相同签名的构造函数
<强>为什么吗
虽然解析方法/构造函数来调用JVM需要一些唯一标识方法的东西(返回类型不够),所以构造函数/方法的参数不能相同
查看强>
答案 1 :(得分:9)
您有两个具有相同参数的构造函数。他们都把一个String作为参数。
如果我打电话Triangle tri = new Triangle("blah");
无法判断“blah”是高度还是类型。您可以通过查看来判断,但JVM不能。每个构造函数都必须有唯一的参数。
答案 2 :(得分:1)
第一种情况下编译错误的原因是,当你通过传递字符串参数初始化类Triangle的对象时,编译器如何知道要调用哪个构造函数;初始化类型的那个或初始化高度的那个。 这是编译器的模糊代码,因此会抛出错误。 就像我说的那样;
Triangle t = new Triangle("xyz");
没有人能分辨出哪个变量会被初始化;类型或高度。
答案 3 :(得分:1)
或者您可以为您的班级添加静态工厂
public class Triangle implements Shape {
...
private Triangle(int height) {
// initialize here
}
private Triangle(String type) {
// initialize here
}
private Triangle(String type, int height) {
// initialize here
}
public static createByHeight(String height) {
return Triangle(Integer.parseInt(height);
}
public static createByType(String type) {
return Triangle(type);
}
public static createByTypeAndHeight(String type, String height) {
return Triangle(type, Integer.parseInt(height);
}
}
答案 4 :(得分:0)
如果您想为构造函数使用两个字符串,则可以将字符串转换为Value对象。
http://c2.com/cgi/wiki?ValueObject
例如:
class Height {
private String height;
public Height(String height){
this.height = height;
}
public String value(){
return this.height;
}
@Override
public String toString(){
return height;
}
@Override
public boolean equals(Object other){
return this.height.equals((Height)other).value()); // Let your IDE create this method, this is just an example
// For example I have missed any null checks
}
}
然后,如果你对Type做了同样的事情,你可以有两个构造函数:
public Triangle(Type type) {
this.type = type;
}
public Triangle(Height height) {
this.height = height;
}
同样类型听起来好像是enum