如何在Java

时间:2018-02-02 06:26:57

标签: java abstract-class

我是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 rateOfInterest(){                 ^     返回类型float与int

不兼容      

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

预期输出

The rate of interest of UNION Bank is 9.5

5 个答案:

答案 0 :(得分:2)

你混淆/混淆了类型。

您的父方法返回类型为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?

答案 1 :(得分:0)

在你的Bank类中,rateOfInterest()返回int值,你的Union rateOfInterest()返回浮点值。

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

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

abstract float rateOfInterest();

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

int rateOfInterest(){
        return 9;
    }

答案 2 :(得分:0)

即使这个解决方案也可以帮到你。就像我提到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中投射所需的类型。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

如果您想要 任何 数据类型

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

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