2

我正在做研究,我发现了以下内容:

假设我有一个像下面这样的类,具有以下构造函数:

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从更改Stringint一切正常。下面是修改后的代码:

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;为什么失败了?请解释。

4

5 回答 5

9

不允许重载具有相同签名的构造函数

为什么?

虽然解析调用JVM的方法/构造函数需要唯一标识方法的东西(返回类型不够),所以构造函数/方法的参数不能相同


于 2012-07-02T14:13:23.767 回答
9

您有两个具有相同参数的构造函数。他们都将一个字符串作为参数。

如果我打电话Triangle tri = new Triangle("blah");没有办法判断“blah”应该是高度还是类型。您可能可以通过查看它来判断,但 JVM 不能。每个构造函数都必须有唯一的参数。

于 2012-07-02T14:16:06.917 回答
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);
}

}

于 2012-07-02T15:24:14.250 回答
1

第一种情况出现编译错误的原因是,当您通过传递字符串参数来初始化 Triangle 类的对象时,编译器如何知道要调用哪个构造函数?初始化类型或初始化高度的一个。对于编译器来说,这是一个模棱两可的代码,因此会引发错误。 就像我说的那样;

Triangle t = new Triangle("xyz");

没有人知道要初始化哪个变量;类型或高度。

于 2012-07-02T14:22:34.167 回答
0

如果您想为构造函数使用两个字符串,您可以将字符串转换为值对象。

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;
}

类型听起来也可能是一个枚举

于 2012-07-02T15:01:25.303 回答