首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为高中生开发有关java接口的示例。

为高中生开发有关java接口的示例。
EN

Stack Overflow用户
提问于 2019-04-03 07:46:17
回答 3查看 137关注 0票数 0

我想创建一个名为NUMBER的java接口的示例,它由两个java类implement和COMPLEX实现。我在让它工作时遇到了问题。

例如:我有一个名为add的分数方法,具有以下标头:

代码语言:javascript
复制
public Fraction add(Fraction f) 

和一个名为add的复杂方法,具有以下标头-

代码语言:javascript
复制
public Complex add(Complex c).

当我将接口中的方法定义为

代码语言:javascript
复制
public Object add(Object o) 

然后编译error,我得到的错误是我的error方法没有覆盖接口编号中的抽象方法。

EN

回答 3

Stack Overflow用户

发布于 2019-04-03 08:50:20

问题是,当您编译时,Java发现接口有一个输出Object的名为add的方法,但是在实现类中,它没有找到任何名为add的方法返回Object。相反,您可以让接口的方法返回一个Number,并基于此转换输出。您必须记住,尽管所有方法都必须返回该Number类型。

另一种选择是使用泛型。我不完全确定用泛型类型覆盖方法是如何工作的,但是您可以在您的Number类中使用类似下面这样的内容:

代码语言:javascript
复制
<T> T add(T t);

我不完全确定这是否会起作用,因为我在接口中使用泛型不多,但它可能会起作用。

你也可以这样做:

代码语言:javascript
复制
public interface Number<T extends Number> {
    T add(T t);
}

分数:

代码语言:javascript
复制
public class Fraction implements Number<Fraction> {
    @Override public Fraction add(Fraction f) {
        ...
    }
}

分数:

代码语言:javascript
复制
public class Complex implements Number<Complex> {
    @Override public Complex add(Complex c) {
        ...
    }
}

这样做将允许您使用更具体的类型来定义方法,并且应该可以很好地工作,但有两件事需要注意,一是我不确定这是否是为接口类型包含相同类的“最佳实践”,二是您是否愿意向学生显示泛型类型。它们是一个非常简单但强大的概念,但如果您不想解释,那么第一个解决方案可能最适合您。

票数 1
EN

Stack Overflow用户

发布于 2019-04-03 09:48:02

您的接口应为类型泛型,以适应返回类型参数类型的接口方法要求,请检查以下代码:

首先,您必须将Number 的泛型接口类定义为:

代码语言:javascript
复制
package com.oop.concepts;

public interface Number<T extends Number> {
    T add(T t);
}

一旦你有了带有返回类型T和参数类型T的泛型add,你就可以像下面这样实现它:

代码语言:javascript
复制
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);
    }
}

复杂类的相同:

代码语言:javascript
复制
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);
    }
}

测试类:

代码语言:javascript
复制
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);


    }
}

以上测试用例的输出:

代码语言:javascript
复制
Complex{x=6.8, y=113.56}
Fraction{a=1.0}
Fraction{a=4.4}

希望这能让我们更清楚地理解JAVA中的OOP概念和泛型

我已经将这些代码推入github,have a look

票数 1
EN

Stack Overflow用户

发布于 2019-04-03 08:25:15

正如一些评论所指出的,你的方法的签名不能改变。

如您的示例所示,您将把相同的代码放入两个类中,这并不能以最好的方式演示继承。

一个我已经使用过并且看过很多次的例子是使用形状的面积和周长。为简洁起见,我的示例仅显示了一个方法的示例,假设变量和构造函数已正确生成。

代码语言:javascript
复制
public interface Shape{
    public abstract double area();
    public abstract double volume();
}
代码语言:javascript
复制
public class Rectangle implements Shape {
    ...
    public double area() {
        return width * height;
    }
    ...
}
代码语言:javascript
复制
public class Circle implements Shape {
    ...
    public double area() {
        return Math.PI * Math.pow(radius, 2);
    }
    ...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55485043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档