当前位置: 首页 > 知识库问答 >
问题:

如何从泛型方法访问类的方法

窦国源
2023-03-14

我正在开发一个计算圆形和方形(类)面积的小练习java程序,该程序实现了surface(接口),它有一个名为area()的方法。我需要实现一个名为SumArea的类,该类有一个名为Calcrea()的通用方法,该方法接收Circle circ[]和Square Square[]数组,并执行面积计算

程序结构:

-

public class UseSumArea {
        public static void main(String[] args) {
            Square square[] = { new Square(2.0), new Square(5.0) };
            Circle circ[] = { new Circle(3.0), new Circle(2.0) };
            Surface surf[] = new Surface[square.length + circ.length];
            surf[0] = square[0];
            surf[1] = square[1];
            surf[2] = circ[0];
            surf[3] = circ[1];
            SumArea sum = new SumArea();
            System.out.println("Square's sum area = " + sum.calcArea(square));
            System.out.println("Circle's sum area = " + sum.calcArea(circ));
            System.out.println("Surface's sum area = " + sum.calcArea(surf));
        }
    
    }

urface.java

public interface Surface {
    public double area();
}

quare.java

public class Square implements Surface {

private double area;
private double side;

public Square(double l) {
    this.side = l;
    area();
}

@Override
public double area() {
    return this.area = (this.side)*(this.side);
}

public double getArea() {
    return area;
}

public void setArea(double area) {
    this.area = area;
}

public double getSide() {
    return side;
}

public void setSide(double side) {
    this.side = side;
}

}

圆圈java

public class Circle implements Surface {

private double area;
private double radius;

public Circle (double r) {
    this.radius = r;
    area();
}

@Override
public double area() {
    return area = (((this.radius)*(this.radius))*(Math.PI));
}

public double getRadius() {
    return radius;
}

public void setRadius(double raio) {
    this.raio = raio;
}

public double getArea() {
    return area;
}

public void setArea(double area) {
    this.area = area;
}

}

rea.java

public class SumArea {

private double area;

public <T> double calcArea(T[] t) { //generic method that receives Square and Circle arrays
    double arrayArea = 0;
    for (T a : t) {
        arrayArea = arrayArea+(a.area()); 
    }
    return this.area = arrayArea;
}
}

我怀疑这个SumArea的代码片段:

arrayArea=arrayArea(a.面积());

如何访问此通用方法中每个圆形和方形对象的area()方法?

共有2个答案

傅博瀚
2023-03-14

由于Andy Turner已经解决了泛型类型的问题,所以我只想添加一个与类设计相关的建议。

我认为这些类的设计有点冗余。您需要创建一个SumArea的实例来进行计算。最后一次calcArea()方法调用的最后一次结果将存储在这个对象中(假设这个计算要复杂得多,而且需要CPU)。

但是我们真的需要把方法已经返回的值存储到其他地方吗?在这种情况下,将计算历史(作为单个变量或值的集合)变现的想法似乎没有用处,因为如果不知道计算涉及哪些对象,就无法重用它。

如果不存储结果,该方法将不会绑定到状态,即它必须是静态的。由于接口可以有静态方法,因此可以将其放置在界面中,而不是为此创建实用程序类。像那样。

public interface Surface {
    public double area();

    public static <T extends Surface> double calcArea(T[] t) { //generic method that receives Square and Circle arrays
        double arrayArea = 0;
        for (T a : t) {
            arrayArea += a.area();
        }
        return arrayArea;
    }
}

请注意,与类不同,在接口中声明的静态行为只能通过使用接口名称来调用:

System.out.println("Circle's sum area = " + Surface.calcArea(circ));
汤乐家
2023-03-14

你需要绑定类型变量:

public <T extends Surface> double calcArea(T[] t) {

或者只需将参数声明为Surfaces的数组:

public double calcArea(Surface[] t) {

注意,后者更可取,因为泛型和数组不能很好地结合在一起。如果出于其他原因需要使用类型变量,建议更改为集合,或类似:

public <T extends Surface> double calcArea(Collection<T> t) {

(而且,作为偏好的一个次要问题,我将使用S而不是T来命名扩展Surface的类型变量)

 类似资料:
  • 问题内容: 我有一个包含静态创建方法的类。 当我使用时,它可以被编译。但是当我使用时,它编译失败,如何指定泛型? 问题答案: 假设您询问有关在类型推断失败的情况下显式指定类型的信息,则可以使用(请注意,该类型在after之后而不是before之前)。

  • 问题内容: 当涉及到没有泛型的类时,我可以这样访问.class属性: 但是,如果Foo具有泛型,我如何访问此“ .class”属性?像这样: 我试图返回,但这无法正常工作:。 我如何进入的课程? 问题答案: 您可以随时这样做: 您将拥有未经检查的强制转换警告,因为它确实是不安全的-正如其他人提到的那样,返回的类对象不再像“的类”那样是“ 的类”。

  • 问题内容: 如果在Java中创建泛型类(该类具有泛型类型参数),则可以使用泛型方法(该方法带有泛型类型参数)吗? 考虑以下示例: 正如您对通用方法所期望的那样,我可以使用任何对象调用的实例: 但是,如果我尝试使用 不 指定泛型类型的实例,则无论传入什么,我都会调用返回, 奇怪的是,如果返回类型是通用类,它将编译(例如(实际上,这可以解释-参见下面的答案)): 此外,如果输入通用类,即使仅使用通配符

  • 如果在Java中创建泛型类(该类具有泛型类型参数),是否可以使用泛型方法(该方法采用泛型类型参数)? 考虑下面的例子: 正如您所期望的那样,对于任何对象,的实例,我都可以调用: 但是,如果我试图使用的实例而不指定泛型类型,那么调用将返回一个

  • 现在我希望以泛型的方式使用这些类。 如何从方法“method1”和“method2”返回泛型类型(可以是猫或狗)。我有几个返回“T extends Animal”的方法,所以最好在方法级别或类级别中声明泛型类型。

  • 问题内容: 我希望这段代码可以说明问题: 我知道我可能做错了什么,因为继承可能不应该以这种方式使用。但这是我遇到的最简单的方法。而且,除此之外,我很好奇。可能吗? 问题答案: 似乎起作用。 根据JLS第15.12节 班级名称 。超级。NonWildTypeArguments_opt标识符(ArgumentList_opt) 是有效的MethodInvocation