Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/368.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实现一个调用接口方法的类?_Java_Generics_Interface_Abstraction - Fatal编程技术网

Java 实现一个调用接口方法的类?

Java 实现一个调用接口方法的类?,java,generics,interface,abstraction,Java,Generics,Interface,Abstraction,我真的在寻找答案。我想创建一段通用代码,它只遍历目录树。也许它只是一个包含一个方法的静态类。没问题。对于不是目录的每个文件,它都会执行一些操作。我认为应该为这个东西定义一个接口(我现在称它为FileActionInterface.performAction()),但我不确定如何编写目录遍历器代码来调用这个接口方法(它还不存在)。我见过并使用过其他Java类,它们的方法是“addinterfacehandler()”,然后该类将运行您实现的接口。如果你什么也不进来,什么也不会发生 对不起,我在这里

我真的在寻找答案。我想创建一段通用代码,它只遍历目录树。也许它只是一个包含一个方法的静态类。没问题。对于不是目录的每个文件,它都会执行一些操作。我认为应该为这个东西定义一个接口(我现在称它为
FileActionInterface.performAction()
),但我不确定如何编写目录遍历器代码来调用这个接口方法(它还不存在)。我见过并使用过其他Java类,它们的方法是“addinterfacehandler()”,然后该类将运行您实现的接口。如果你什么也不进来,什么也不会发生

对不起,我在这里找对了词。如何编写这个目录遍历器代码来调用抽象代码

PS 所有这些都是很好的答案,我已经做了标记。当一个类有一个类似“addInterfaceHandler()”的类方法时,他们是怎么做的?我猜这个类有它自己的接口实现,但它可能是空的。然后,当调用add()方法时,可以替换类的实现,或者像添加接口实现数组一样添加到类中


我将开始尝试您的不同解决方案。

您将传入一个实现所述接口的对象

walking方法将调用该对象上的方法

类似于如何使用

非常粗略地说:

public class Walker {
    private Visitor v;
    public Walker(Visitor v) { this.v = v; }
    public walk(File dir) {
        // pseudo-code
        for (File f : dir.getFiles()) {
            if (f.isDir()) {
                walk(f);
            } else {
                v.performAction(f);
            }
        }
    }
}

您将传入一个实现所述接口的对象

walking方法将调用该对象上的方法

类似于如何使用

非常粗略地说:

public class Walker {
    private Visitor v;
    public Walker(Visitor v) { this.v = v; }
    public walk(File dir) {
        // pseudo-code
        for (File f : dir.getFiles()) {
            if (f.isDir()) {
                walk(f);
            } else {
                v.performAction(f);
            }
        }
    }
}

作为一种简单的静态方法:

static public walkTree(File dir, Visitor vis) {
    for(File fil: dir.getFiles()) {
        if(fil.isDirectory()) { walkTree(f,vis);      }
        else                  { vis.performAction(f); }
        }
    }

(假设访问者有一个performation方法。)

作为一个简单的静态方法:

static public walkTree(File dir, Visitor vis) {
    for(File fil: dir.getFiles()) {
        if(fil.isDirectory()) { walkTree(f,vis);      }
        else                  { vis.performAction(f); }
        }
    }

(假设访问者有一个performation方法。)

您可以编写两种类型。第一个是一个接口,它声明了一个方法,如果有人想使用您的walker,就必须实现该方法

public interface FileAction {

  void perform(File file) throws IOException;

}
另一个是步行者本身:

public final class FileWalker {

  public void scan(File directory, FileAction action) throws IOException {
    if (!directory.isDirectory())
      throw new IllegalArgumentException("Not a directory.");
    File[] sub = directory.listFiles();
    if (sub == null)
      throw new FileNotFoundException("Failed to list directory contents.");
    for (File f : sub) {
      if (f.isDirectory())
        scan(f, action);
      else
        /* This is where you invoke the implementation of the interface. */
        action.perform(f);
    }
  }

}
您的用户将实现您声明的接口。它可以在
perform()
方法的实现中执行任何需要的操作,该方法将由您的文件漫游器调用:

final class SizeCalculator implements FileAction {

  private long total = 0;

  @Override
  public void perform(File file) {
    total += file.length();
  }

  long getTotal() {
    return total;
  }

}
然后他们会一起使用他们的对象和你的对象:

final class Test {

  public static void main(String[] argv) throws IOException {
    SizeCalculator sizer = new SizeCalculator();
    FileWalker walker = new FileWalker();
    File cwd = new File("");
    walker.scan(cwd, sizer);
    System.out.printf("Directory contains %d bytes.%n", sizer.getTotal());
  }

}

如果您使用的是Java7,并且您的应用程序实际上正在遍历文件树,那么您应该使用来遍历文件树。在这里,要实现的接口是由核心Java库声明的接口。

您可以编写两种类型。第一个是一个接口,它声明了一个方法,如果有人想使用您的walker,就必须实现该方法

public interface FileAction {

  void perform(File file) throws IOException;

}
另一个是步行者本身:

public final class FileWalker {

  public void scan(File directory, FileAction action) throws IOException {
    if (!directory.isDirectory())
      throw new IllegalArgumentException("Not a directory.");
    File[] sub = directory.listFiles();
    if (sub == null)
      throw new FileNotFoundException("Failed to list directory contents.");
    for (File f : sub) {
      if (f.isDirectory())
        scan(f, action);
      else
        /* This is where you invoke the implementation of the interface. */
        action.perform(f);
    }
  }

}
您的用户将实现您声明的接口。它可以在
perform()
方法的实现中执行任何需要的操作,该方法将由您的文件漫游器调用:

final class SizeCalculator implements FileAction {

  private long total = 0;

  @Override
  public void perform(File file) {
    total += file.length();
  }

  long getTotal() {
    return total;
  }

}
然后他们会一起使用他们的对象和你的对象:

final class Test {

  public static void main(String[] argv) throws IOException {
    SizeCalculator sizer = new SizeCalculator();
    FileWalker walker = new FileWalker();
    File cwd = new File("");
    walker.scan(cwd, sizer);
    System.out.printf("Directory contains %d bytes.%n", sizer.getTotal());
  }

}

如果您使用的是Java7,并且您的应用程序实际上正在遍历文件树,那么您应该使用来遍历文件树。这里,要实现的接口是由核心Java库声明的接口。

有人已经为Java 1.7提供了一个很好的答案,有人已经为Java 1.7提供了一个很好的答案,而不是“FileAction”,我可能会使用类似“函数”或“Action”的接口。perform()如果没有参数或函数具有公共O应用(I输入),而不是“FileAction”,我可能会使用类似于“函数”或接口“Action”具有的操作。如果没有参数或函数具有公共O应用(I输入),则执行()