覆盖toString()但数据类型为Integer

时间:2017-03-01 17:40:47

标签: java

当我运行此代码时,输​​出为(MyInt @ 15db9742) - 对象地址 - :

public static void main(String[] args) {
    MyInt myInt = new MyInt(2);
    System.out.println(myInt);
}

class MyInt {
   public int val;
   public MyInt(int val){
       this.val = val;
   }
}

我想要做的是:打印没有myInt.val的val

我试图覆盖toString()?!

public String toString(){
  return ""+val;
}

它有效!但我希望返回类型为int / Integer NOT String,并且存在编译器错误

  

返回类型与Object.toString()“

不兼容

当我将返回类型更改为int时。有没有办法做到这一点?

编辑:

简而言之:

Integer integer =  new Integer(5);
int INT = integer;
System.out.println(INT);

所以我希望myClass“MyInt”的工作方式就像“Integer”类一样 所以我可以直接分配int val

MyInt myInt = new MyInt(5);
int INT = myInt; // I don't need to type "myInt.val"
System.out.println(INT);

2 个答案:

答案 0 :(得分:6)

概念和代码质量级别错误。

该方法称为 toString()

每个Java程序员都知道这件事应该做什么(提供你调用它的对象的字符串表示)。

每个Java程序员都希望此方法返回 String ,而不是int。

长话短说:而不是覆盖现有方法并彻底改变他们的行为(顺便说一句,这是一个非常糟糕的想法):只需添加自己的新方法并给出一个合理的名称。

最后:您的想法(更改方法的“合同”)通常违反了Liskov Substitution Principle。含义:不要做因为你可以做这些事情。而是真正学习和理解您打算使用的概念。我所说的:良好的OO设计中的正确的继承比在某处放置一些 extends 关键字更强更多;和一些@Override在方法声明面前。

答案 1 :(得分:1)

当你打电话给这个时,你似乎误解了幕后发生的事情:

System.out.println(myInt);

println方法接受Object参数,然后在该对象上调用.toString()方法。 toString()方法始终返回一个字符串。因此你所做的(返回一个字符串)是正确的。

请注意,执行此操作时:

System.out.println(1);

然后有println专门用于int参数的重载。但是您无法将对象传递给println并期望将其视为基本类型。