1

我为我的项目定义了一个名为Function. 它只有一种方法,call,如下所示:

    public interface Function {
       public void call();
    }

在我的 Field 对象中,我有这个:

    public class Field {
      private Square[][] matrix; //Square is dispensable.
      public Field(int rows, int cols) {
        matrix = new Square[rows][cols];
        for(int i = 0; i < rows; i++){
          for(int j = 0; j < cols; j++){
            this.matrix = new Square(i * Square.NORMAL_WIDTH, j * Square.NORMAL_HEIGHT);
          }
        }
      }
    }

它运行良好,并且类似于 JavaScript,但我无法将注意力转移到它身上。但考虑到我想开发这种方法:

    public void each(Function f){
      int rows = matrix.length;
      for(int i = 0; i < rows; i++){
        int cols = matrix[i].length;
        for(int j = 0; j < cols; j++){
          f.call();
        }
      }
    }

它将某些代码(在本例中为 Function 实现)附加到矩阵的每个元素。这样,我可以访问它的属性。但是矩阵的每个对象都是正方形。我怎样才能访问它?我可以将它传递给函数,

    //making an small alteration to the parameter.
    public interface Function {
       public void call(Square square);
    }

    public void each(Function f){
      int rows = matrix.length;
      for(int i = 0; i < rows; i++){
        int cols = matrix[i].length;
        for(int j = 0; j < cols; j++){
          f.call(matrix[i][j]);
        }
      }
    }

但是,我仍然会被困在这种Square类型上。我可以使用泛型类型,也许?

4

2 回答 2

2

是的,您需要使其通用。

最简单的情况:

public interface Function<T> {
    public void call(T arg);
}

public void each(Function<Square> f) { ... }

更好的做法是声明each()如下:

public void each(Function<? super Square> f) { ... }

这样您不仅可以应用 ,还可以应用Function<Square>Function的任何超类型,例如

Function<Object> PRINT = new Function<Object>() {
    public void call(Object arg) {
        System.out.println(arg);
    }
}
于 2013-06-21T17:57:49.743 回答
0

代替

private Square[][] matrix;

利用

private Function[][] matrix;

并且代码与 Square 无关。当然,最终它会被绑定到一个具体的类,但代码的耦合度较低。(而且我不确定泛型是否会有所帮助,因为现在还为时过早,我无法更努力地思考 :-)

于 2013-06-21T17:58:41.583 回答