如何在java抽象类中返回不同的数据类型

如何在java抽象类中返回不同的数据类型,java,abstract-class,Java,Abstract Class,我是java新手,我正在学习抽象类,但我一直停留在一个地方 我想将不同的数据类型返回到抽象类库,但我做不到。我确实提到了这个问题,因为我在java方面的经验较少,因此我不理解该链接的解决方案。请任何人帮助我解决这个问题 代码 abstract class Bank{ abstract int rateOfInterest(); } class Icici extends Bank{ int rateOfInterest(){ return 8; } }

我是java新手,我正在学习抽象类,但我一直停留在一个地方

我想将不同的数据类型返回到
抽象类库
,但我做不到。我确实提到了这个问题,因为我在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());
    }
}
错误

java:18:错误:Union不是抽象的,并且不重写Bank中的抽象方法rateOfInterest()

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

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

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

预期产出

The rate of interest of UNION Bank is 9.5

你把类型搞混了

您的父方法返回类型是
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也有浮点,并从这里的讨论中选择最佳数据类型

在您的银行类中,rateOfInterest()返回int值,而Union rateOfInterest()返回浮点值

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

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

abstract float rateOfInterest();
int rateOfInterest(){
        return 9;
    }
否则,在Union类中将返回类型从float更改为int,如下所示

abstract float rateOfInterest();
int rateOfInterest(){
        return 9;
    }

即使这个解决方案也可以帮助您。正如我在这里提到的,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中转换所需的类型。

除了实际问题之外,您的示例还重新展示了信息隐藏原理和功能嫉妒代码气味的可能漏洞

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

在现实生活中,你的银行不允许你自己计算你的账户存款。你宁愿让你的银行在固定的时间段内这样做,并且计算应该在银行内部进行

您需要一个不同的界面:

interface Bank {
   void subLoanInterest();
   void addSavingsInterest();
   void printDeposit(PrintStream out);
}


Bank someBank = new Sbi(1000); // initial value
someBank.addSavingsInterest();
someBank.printDeposit(System.out);
如果要任何数据类型

class Bank<T>{
T rateOfInterest();
}
类库{
T利率();
}

T意味着它将接受并返回您实例化它所使用的任何数据类型。

将您所有的
rateOfInterest
更改为返回
BigDecimal
,谢谢您的回答,但如果我的数据类型在不同的孩子中不同,那么如何返回呢?@sachindobey在返回之前将其转换。我们可以使用泛型吗?甚至
double
不适合计算货币,因为它与
float
遇到相同的定长近似问题。两者都不能表示
0.1
,因为这在二进制中是一个无穷的分数。@sachindobey genecics适用于对象类型,但可以使用原语计算