我想创建一个名为NUMBER的Java接口的示例,该接口由两个Java类FRACTION和COMPLEX实现。我在使其正常工作时遇到问题。
例如:我有一个名为add的FRACTION方法,带有以下标头-
public Fraction add(Fraction f)
和一个名为add的COMPLEX方法,带有以下标头-
public Complex add(Complex c).
当我在界面中将方法定义为
时public Object add(Object o)
并编译Fraction,我得到了我的Fraction方法没有覆盖接口NUMBER中的抽象方法的错误。
答案 0 :(得分:1)
问题在于,当您进行编译时,Java会看到该接口具有一个名为add
的方法,该方法会输出Object
,但是在实现类中,它找不到任何方法名{{1 }}返回add
。您可以改为使接口的方法返回Object
,然后根据该方法强制转换输出。您必须记住,尽管所有方法都必须返回该Number
类型。
另一种选择是使用泛型。我不太确定泛型类型的重写方法如何工作,但是您可以在Number
类中使用类似以下内容的东西:
Number
我不确定这是否行得通,因为我没有在接口中使用泛型,但是可能会。
您也许还可以执行以下操作:
<T> T add(T t);
分数:
public interface Number<T extends Number> {
T add(T t);
}
分数:
public class Fraction implements Number<Fraction> {
@Override public Fraction add(Fraction f) {
...
}
}
这样做可以让您使用更具体的类型来定义方法,并且应该可以很好地工作,但是两件事是我不确定是否认为“最佳实践”为接口的同一个类包括同一个类类型,如果您愿意向学生展示普通类型。它们是一个非常简单但功能强大的概念,但是如果您不想解释,第一个解决方案可能最适合您。
答案 1 :(得分:1)
您的界面应为通用类型,以同时满足返回类型和参数类型的界面方法要求,请检查以下内容代码:
首先,您必须将通用接口类Number
定义为:
package com.oop.concepts;
public interface Number<T extends Number> {
T add(T t);
}
一旦您具有带有返回类型T和参数类型T的泛型添加,就可以按以下方式实现它:
package com.oop.concepts;
public class Fraction implements Number<Fraction> {
private float a;
public Fraction(float a) {
this.a = a;
}
@Override
public String toString() {
return "Fraction{" +
"a=" + a +
'}';
}
@Override
public Fraction add(Fraction n) {
return new Fraction(this.a + n.a);
}
}
与复杂课程相同:
package com.oop.concepts;
public class Complex implements Number<Complex> {
private Double x;
private Double y ;
public Complex (Double x, Double y) {
this.x = x;
this.y = y;
}
@Override
public String toString() {
return "Complex{" +
"x=" + x +
", y=" + y +
'}';
}
@Override
public Complex add(Complex n) {
return new Complex(this.x + n.x, this.y + n.y);
}
}
测试类别:
package com.oop.concepts;
public class TestNumber {
public static void main (String args[]) {
Complex c1 = new Complex(3.4, 56.78);
Complex c2 = new Complex(3.4, 56.78);
Complex c3 = c1.add(c2);
System.out.println(c3);
Fraction f1 = new Fraction(3.4f);
Fraction f2 = new Fraction(1.0f);
Fraction f3 = f1.add(f2);
System.out.println(f3);
}
}
上述测试用例的输出:
Complex{x=6.8, y=113.56}
Fraction{a=1.0}
Fraction{a=4.4}
希望这可以清楚地理解OOP概念以及 JAVA中的泛型
我已将这些代码推送到github have a look
中答案 2 :(得分:0)
正如一些评论所指出的那样,方法的签名不能更改。
如您的示例所示,您将在两个类中放入相同的代码,但这并没有以最佳方式展示继承。
我已经使用并看到多次使用的一个示例是使用形状的面积和周长。为简洁起见,我的示例仅显示一种方法的示例,并假设变量和构造函数已正确制作。
public interface Shape{
public abstract double area();
public abstract double volume();
}
public class Rectangle implements Shape {
...
public double area() {
return width * height;
}
...
}
public class Circle implements Shape {
...
public double area() {
return Math.PI * Math.pow(radius, 2);
}
...
}