0

2 つのインターフェイスと、それらを実装する 1 つのクラスがあります。インターフェイスでは、1 つの通常のメソッドと 1 つのジェネリック メソッドを示しました。それらをメインメソッドに実装すると、通常のメソッドは正しい結果を示しますが、一般的なメソッドはそうではありません。可能であれば、recrease_twice() メソッドが正しい結果を返さない理由を教えてください。ここに私のコードがあります:

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();


}

幾何学的形状.java:

public interface GeometricShape<T extends GeometricShape<T>>
{
    public void describe();
    public T increase_twice();

}

最後にクラス ArrayListExample.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 が Rectangle[width=4.0, height=6.0] Rectangle[width=10.0, height=10.0] で長方形を返すことを期待していますが、代わりに describe メソッドと同じものを返します: Rectangle[width=2.0, height=3.0 ] Rectangle[幅=5.0, 高さ=5.0] できればどこが間違っているのか教えていただけないでしょうか?

4

2 に答える 2

1

問題は increase_twice 関数にあると思います。呼び出しrects.get(i).increase_twice();ているときは、実際には、値が 2 倍になって返される新しい Rectangle オブジェクトを作成しています。現在のオブジェクトを更新していません。increase_twice メソッドは次のようにする必要があります。

@Override
    public void increase_twice() {
        // TODO Auto-generated method stub
        this.width *= 2;
        this.height *= 2;
    }

このようにして、ArrayList から取得している現在のオブジェクトの幅と高さの値を更新します。新しい Rectangle オブジェクトを返す必要はないと思うので、 increase_twice() の定義を変更する必要があるかもしれません。

それがうまくいくかどうか教えてください。

于 2016-11-23T01:26:55.610 に答える
1

Rectangle.increase_twice() は新しいオブジェクトを返します。ただし、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;
    }

そして、これへの GeometryShape.increase_twice() 宣言:

public void increase_twice();
于 2016-11-23T01:28:06.140 に答える