【问题标题】:How to Return Different data types in Abstract class of java如何在java的抽象类中返回不同的数据类型
【发布时间】:2018-02-02 06:26:56
【问题描述】:

我是 java 新手,我正在学习抽象类,但我卡在一个地方。

我想将不同的数据类型返回给abstract class Bank,但我不能这样做。我确实提到了Different return types of abstract method in java without casting 这个问题,因为我在 java 方面的经验较少,因此我不明白该链接的解决方案。请任何人帮助我来解决问题

代码

abstract class Bank{
    abstract int rateOfInterest();
}

class Icici extends Bank{
    int rateOfInterest(){
        return 8;
    }
}

class Sbi extends Bank{
    int rateOfInterest(){
        return 7;
    }
}


class Union extends Bank{
    float rateOfInterest(){
        return 9.5;
    }
}


class Interest {
    public static void main(String args[]){
        Bank uni = new Union();
        System.out.println("The rate of interest of UNION Bank is "+uni.rateOfInterest());
    }
}

错误

test.java:18: 错误:Union 不是抽象的,并且不会覆盖 Bank 中的抽象方法 rateOfInterest()

类联合扩展银行{ ^ test.java:19: 错误:Union 中的 rateOfInterest() 无法覆盖 Bank 中的 rateOfInterest()

浮动利率(){ ^ 返回类型 float 与 int 不兼容

test.java:20: 错误:不兼容的类型:从双精度到浮点的可能有损转换 返回 9.5; ^ 3 个错误

预期输出

The rate of interest of UNION Bank is 9.5

【问题讨论】:

  • 将您的所有rateOfInterest 更改为返回BigDecimal

标签: java abstract-class


【解决方案1】:

你混淆了类型。

您的父方法返回类型是int,而您在孩子中将其作为float。那是行不通的。

在任何地方都将其更改为相同的数据类型。

除此之外,使用double 代替浮动利率。这是适合利率的数据类型。

abstract class Bank{
    abstract double rateOfInterest();
}

class Icici extends Bank{
    double rateOfInterest(){
        return 8;
    }
}

class Sbi extends Bank{
    double rateOfInterest(){
        return 7;
    }
}


class Union extends Bank{
    double rateOfInterest(){
        return 9.5;
    }
}


class Interest {
    public static void main(String args[]){
        Bank uni = new Union();
        System.out.println("The rate of interest of UNION Bank is "+uni.rateOfInterest());
    }
}

再次 double 也有浮点,并从这里的讨论中选择最佳数据类型 What is the best data type to use for money in Java app?

【讨论】:

  • 感谢您的回答,但如果我的数据类型在不同的孩子中不同,那么如何返回?
  • @sachindubey 在返回之前将其转换。
  • 我们可以使用泛型吗?
  • 即使double 也不适合计算金钱,因为它与float 存在相同的固定长度近似 问题。两者都不能代表0.1,因为这是二进制的无穷小数
  • @sachindubey genecics 适用于 object types,但您使用 primitives 进行计算
【解决方案2】:

在您的 Bank 类中,rateOfInterest() 返回 int 值,您的 Union rateOfInterest() 返回 float 值。

当你在子类中实现抽象方法时,你返回的类型应该是更高的类型,不应该是更低的类型。

要解决这个问题,您可以将返回类型从 int 更改为 float,如下所示

abstract float rateOfInterest();

否则在你的 Union 类中将返回类型从 float 更改为 int,如下所示

int rateOfInterest(){
        return 9;
    }

【讨论】:

    【解决方案3】:

    即使这个解决方案也可以帮助你。正如我在这里提到的那样,double 是更高的类型,它按照您的预期存储 int、float 值。

    abstract class Bank{
        abstract Double rateOfInterest();
    }
    
    class Icici extends Bank{
        Double rateOfInterest(){
            return 8d;
        }
    }
    
    class Sbi extends Bank{
        Double rateOfInterest(){
            return 7d;
        }
    }
    
    
    class Union extends Bank{
        Double rateOfInterest(){
            return 9.5;
        }
    }
    
    
    class Interest {
        public static void main(String args[]){
            Bank uni = new Union();
            System.out.println("The rate of interest of UNION Bank is "+uni.rateOfInterest());
        }
    }
    

    您可以从 Double 转换所需的类型。

    【讨论】:

      【解决方案4】:

      除了实际问题之外,您的示例还揭示了可能违反信息隐藏原则和功能嫉妒代码气味。

      Bank 实现者公开其利率可能会导致代码中您将使用该属性的计算放入一个类中使用银行:

      int deposit = 1000;
      Bank someBank = new Sbi();
      deposit += deposit * someBank.rateOfInterest();
      

      在现实生活中,您的银行不允许您自己计算账户存款。您宁愿让您的银行定期执行此操作,并且应该在银行内部进行计算。

      你需要一个不同的界面:

      interface Bank {
         void subLoanInterest();
         void addSavingsInterest();
         void printDeposit(PrintStream out);
      }
      
      
      Bank someBank = new Sbi(1000); // initial value
      someBank.addSavingsInterest();
      someBank.printDeposit(System.out);
      

      【讨论】:

        【解决方案5】:

        如果您想要任何数据类型

        class Bank<T>{
        T rateOfInterest();
        }
        

        T 表示它将接受并返回您实例化它的任何数据类型。

        【讨论】:

          猜你喜欢
          • 2014-06-27
          • 2019-03-12
          • 2016-09-21
          • 1970-01-01
          • 2014-04-03
          • 2011-12-16
          • 1970-01-01
          • 2017-12-01
          • 1970-01-01
          相关资源
          最近更新 更多