从 java 中的接口实现泛型方法
Implementing generic method from interface in java
我有两个接口和一个 class 实现它们。在界面中,我展示了一种常用方法和一种通用方法。在 main 方法中实现它们时,通常的方法会显示正确的结果,但通用方法不会。如果可能的话,你能告诉我,为什么 increase_twice() 方法没有 return 正确的结果吗?这是我的代码:
Rectangle.java:
public class Rectangle implements TwoDShape {
private double width, height;
public Rectangle (double width, double height) {
this.width = width;
this.height = height;
}
public double area() {
return width * height;
}
public double perimeter() {
return 2.0 * (width + height);
}
public void describe() {
System.out.println("Rectangle[width=" + width + ", height=" + height + "]");
}
@Override
public Rectangle increase_twice() {
// TODO Auto-generated method stub
return new Rectangle(2*this.width, 2*this.height);
}
}
TwoDShape.java:
public interface TwoDShape extends GeometricShape {
public double area();
}
GeometricShape.java:
public interface GeometricShape<T extends GeometricShape<T>>
{
public void describe();
public T increase_twice();
}
最后测试classArrayListExample.java
import java.util.ArrayList;
public class ArrayListExample {
public static void describe_all( ArrayList<? extends GeometricShape> shapes )
{
for(int i=0;i<shapes.size();i++)
{
shapes.get(i).describe();
}
System.out.println("Total number of shapes:"+ shapes.size());
}
private static ArrayList<Rectangle> increase_size(ArrayList<Rectangle> rects)
{
for(int i=0;i<rects.size();i++)
{
rects.get(i).increase_twice();
}
return rects;
}
public static void main(String[] args) {
System.out.println("The result of describe() method:");
System.out.println();
System.out.println("Example rectangles");
ArrayList<Rectangle> rects = new ArrayList<Rectangle>();
rects.add(new Rectangle(2.0, 3.0));
rects.add(new Rectangle(5.0, 5.0));
describe_all(rects);
System.out.println();
System.out.println("The result of increase_twice() method:");
System.out.println();
System.out.println("Example rectangles after increase:");
ArrayList<Rectangle> double_rects = increase_size(rects);
describe_all(double_rects);
}
}
我希望 increase_twice 将 return 矩形 [width=4.0, height=6.0]
Rectangle[width=10.0, height=10.0] 但它 return 与 describe 方法相同,即:
矩形[width=2.0, height=3.0]
矩形[width=5.0, height=5.0]
如果可以的话,你能告诉我哪里出错了吗?
我认为问题出在 increase_twice 函数中。当您调用 rects.get(i).increase_twice();
时,您实际上是在创建一个具有双倍值和 returning 的新 Rectangle 对象。您没有更新当前对象。
increase_twice 方法应该是:
@Override
public void increase_twice() {
// TODO Auto-generated method stub
this.width *= 2;
this.height *= 2;
}
这样您将更新从 ArrayList 获取的当前对象的宽度和高度值。
您可能必须更改 increase_twice() 的定义,因为我认为您不需要 return 一个新的 Rectangle 对象。
如果可行,请告诉我。
Rectangle.increase_twice() returns 一个新对象。但是,在 ArrayListExample.increase_size() 中,未设置返回的对象。
您可以将该方法修改为:
private static ArrayList<Rectangle> increase_size(ArrayList<Rectangle> rects) {
for (int i = 0; i < rects.size(); i++) {
rects.set(i, rects.get(i).increase_twice());
}
return rects;
}
或者您可以将 Rectangle.increase_twice() 修改为:
@Override
public void increase_twice() {
// TODO Auto-generated method stub
this.width = 2 * this.width;
this.height = 2 * this.height;
}
和GeometricShape.increase_twice()声明:
public void increase_twice();
我有两个接口和一个 class 实现它们。在界面中,我展示了一种常用方法和一种通用方法。在 main 方法中实现它们时,通常的方法会显示正确的结果,但通用方法不会。如果可能的话,你能告诉我,为什么 increase_twice() 方法没有 return 正确的结果吗?这是我的代码:
Rectangle.java:
public class Rectangle implements TwoDShape {
private double width, height;
public Rectangle (double width, double height) {
this.width = width;
this.height = height;
}
public double area() {
return width * height;
}
public double perimeter() {
return 2.0 * (width + height);
}
public void describe() {
System.out.println("Rectangle[width=" + width + ", height=" + height + "]");
}
@Override
public Rectangle increase_twice() {
// TODO Auto-generated method stub
return new Rectangle(2*this.width, 2*this.height);
}
}
TwoDShape.java:
public interface TwoDShape extends GeometricShape {
public double area();
}
GeometricShape.java:
public interface GeometricShape<T extends GeometricShape<T>>
{
public void describe();
public T increase_twice();
}
最后测试classArrayListExample.java
import java.util.ArrayList;
public class ArrayListExample {
public static void describe_all( ArrayList<? extends GeometricShape> shapes )
{
for(int i=0;i<shapes.size();i++)
{
shapes.get(i).describe();
}
System.out.println("Total number of shapes:"+ shapes.size());
}
private static ArrayList<Rectangle> increase_size(ArrayList<Rectangle> rects)
{
for(int i=0;i<rects.size();i++)
{
rects.get(i).increase_twice();
}
return rects;
}
public static void main(String[] args) {
System.out.println("The result of describe() method:");
System.out.println();
System.out.println("Example rectangles");
ArrayList<Rectangle> rects = new ArrayList<Rectangle>();
rects.add(new Rectangle(2.0, 3.0));
rects.add(new Rectangle(5.0, 5.0));
describe_all(rects);
System.out.println();
System.out.println("The result of increase_twice() method:");
System.out.println();
System.out.println("Example rectangles after increase:");
ArrayList<Rectangle> double_rects = increase_size(rects);
describe_all(double_rects);
}
}
我希望 increase_twice 将 return 矩形 [width=4.0, height=6.0] Rectangle[width=10.0, height=10.0] 但它 return 与 describe 方法相同,即: 矩形[width=2.0, height=3.0] 矩形[width=5.0, height=5.0] 如果可以的话,你能告诉我哪里出错了吗?
我认为问题出在 increase_twice 函数中。当您调用 rects.get(i).increase_twice();
时,您实际上是在创建一个具有双倍值和 returning 的新 Rectangle 对象。您没有更新当前对象。
increase_twice 方法应该是:
@Override
public void increase_twice() {
// TODO Auto-generated method stub
this.width *= 2;
this.height *= 2;
}
这样您将更新从 ArrayList 获取的当前对象的宽度和高度值。 您可能必须更改 increase_twice() 的定义,因为我认为您不需要 return 一个新的 Rectangle 对象。
如果可行,请告诉我。
Rectangle.increase_twice() returns 一个新对象。但是,在 ArrayListExample.increase_size() 中,未设置返回的对象。 您可以将该方法修改为:
private static ArrayList<Rectangle> increase_size(ArrayList<Rectangle> rects) {
for (int i = 0; i < rects.size(); i++) {
rects.set(i, rects.get(i).increase_twice());
}
return rects;
}
或者您可以将 Rectangle.increase_twice() 修改为:
@Override
public void increase_twice() {
// TODO Auto-generated method stub
this.width = 2 * this.width;
this.height = 2 * this.height;
}
和GeometricShape.increase_twice()声明:
public void increase_twice();