如何从泛型方法访问 class 的方法
How can I access a method of a class from a generic method
我正在做一个小练习 java 程序计算 圆 和 正方形 (class es) 区域,它实现了 surface(接口),它有一个名为 area() 的方法。一个要求是我必须实现一个名为 SumArea 的 class,它有一个名为 calcArea() 的 通用方法,它接收 Circle circ[]和Square square[]数组,进行面积计算。
程序结构:
-> UseSumArea.java(主要方法)
-> Surface.java(接口)
-> Square.java(实现Surface.java的class)
-> Circle.java(实现Surface.java的class)
-> SumArea.java(class即执行calcArea()方法)
UseSumArea.java
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));
}
}
Surface.java
public interface Surface {
public double area();
}
Square.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;
}
}
Circle.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;
}
}
SumArea.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());
如何访问此泛型方法中每个 Circle 和 Square 对象的 area() 方法?
您需要绑定类型变量:
public <T extends Surface> double calcArea(T[] t) {
或者只是将参数声明为 Surface
s:
的数组
public double calcArea(Surface[] t) {
请注意,后者更可取,因为泛型和数组不能很好地协同工作。如果您出于其他原因需要一个类型变量,建议更改为 Collection
或类似的:
public <T extends Surface> double calcArea(Collection<T> t) {
(而且,作为一个次要的偏好问题,我会使用 S
而不是 T
来命名扩展 Surface
的类型变量)
由于关于泛型类型的问题已经解决,我只想添加一个与class设计相关的建议。
我认为这些 classes 的设计方式有些冗余。您需要创建 SumArea
的实例才能进行计算。最后一个 calcArea()
方法调用的结果将存储在这个对象中(假设这个计算远比 复杂 和 CPU-consuming).
但是我们真的需要将方法返回的值存储在其他地方吗?在这种情况下,兑现计算历史记录(作为单个变量或作为值集合)的想法似乎没有用,因为在不知道 哪些对象[=50 的情况下无法重用它=]参与了计算。
如果不存储结果,此方法将不会绑定到状态,即它必须是 static。由于接口可以有静态方法,因此可以将它放在 Surface
接口中,而不是为此目的创建实用程序 class。就这样。
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;
}
}
注意 与 classes 相比,在接口中声明的静态行为只能通过使用接口名称来调用:
System.out.println("Circle's sum area = " + Surface.calcArea(circ));
另请注意,只有当其他 classes 在 classes Circle
和 Square
中有一个字段 area
才有意义字段将被声明为 final,即它们在对象构造期间必须仅初始化一个并且 setter 变得不必要。
在这种情况下(假设 radius
已声明为 final 并且在分配时正在验证 reduce > 0
)方法 area()
将如下所示:
@Override
public double area() {
if (area > 0) { // `0` is a default value for instance variables
return area; // reusing already calculated value
}
return area = radius * radius * Math.PI;
}
并且不能有两种方法 area()
和 getArea()
任其一。
我正在做一个小练习 java 程序计算 圆 和 正方形 (class es) 区域,它实现了 surface(接口),它有一个名为 area() 的方法。一个要求是我必须实现一个名为 SumArea 的 class,它有一个名为 calcArea() 的 通用方法,它接收 Circle circ[]和Square square[]数组,进行面积计算。
程序结构:
-> UseSumArea.java(主要方法)
-> Surface.java(接口)
-> Square.java(实现Surface.java的class)
-> Circle.java(实现Surface.java的class)
-> SumArea.java(class即执行calcArea()方法)
UseSumArea.java
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));
}
}
Surface.java
public interface Surface {
public double area();
}
Square.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;
}
}
Circle.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;
}
}
SumArea.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());
如何访问此泛型方法中每个 Circle 和 Square 对象的 area() 方法?
您需要绑定类型变量:
public <T extends Surface> double calcArea(T[] t) {
或者只是将参数声明为 Surface
s:
public double calcArea(Surface[] t) {
请注意,后者更可取,因为泛型和数组不能很好地协同工作。如果您出于其他原因需要一个类型变量,建议更改为 Collection
或类似的:
public <T extends Surface> double calcArea(Collection<T> t) {
(而且,作为一个次要的偏好问题,我会使用 S
而不是 T
来命名扩展 Surface
的类型变量)
由于关于泛型类型的问题已经解决
我认为这些 classes 的设计方式有些冗余。您需要创建 SumArea
的实例才能进行计算。最后一个 calcArea()
方法调用的结果将存储在这个对象中(假设这个计算远比 复杂 和 CPU-consuming).
但是我们真的需要将方法返回的值存储在其他地方吗?在这种情况下,兑现计算历史记录(作为单个变量或作为值集合)的想法似乎没有用,因为在不知道 哪些对象[=50 的情况下无法重用它=]参与了计算。
如果不存储结果,此方法将不会绑定到状态,即它必须是 static。由于接口可以有静态方法,因此可以将它放在 Surface
接口中,而不是为此目的创建实用程序 class。就这样。
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;
}
}
注意 与 classes 相比,在接口中声明的静态行为只能通过使用接口名称来调用:
System.out.println("Circle's sum area = " + Surface.calcArea(circ));
另请注意,只有当其他 classes 在 classes Circle
和 Square
中有一个字段 area
才有意义字段将被声明为 final,即它们在对象构造期间必须仅初始化一个并且 setter 变得不必要。
在这种情况下(假设 radius
已声明为 final 并且在分配时正在验证 reduce > 0
)方法 area()
将如下所示:
@Override
public double area() {
if (area > 0) { // `0` is a default value for instance variables
return area; // reusing already calculated value
}
return area = radius * radius * Math.PI;
}
并且不能有两种方法 area()
和 getArea()
任其一。