Почему тип NIO.2 FileVisitor является общим?

Я занимаюсь некоторыми исследованиями на Java NIO.2 и его файловыми операциями, и в настоящее время я играю с функциями и классами, управляющими файлами.

NIO.2 FileVisitor API замечательный, стыдно, что такая вещь была добавлена ​​в Java SE только недавно, а не десять лет назад. Однако есть что-то, что меня немного беспокоит: в чем смысл создания FileVisitor интерфейса generic?

Каждый пример в сети показывает, как использовать его с Files.walkFileTree(), что подразумевает, что мы используем тип FileVisitor<Path>. Но я просто не вижу никакого использования для этого интерфейса для других вещей, кроме Path. Может быть, можно использовать FileVisitor для того, чтобы ходить по другим видам деревьев (в памяти?), Но это просто не очень хорошо: этот интерфейс и связанные классы имеют очень специфические имена, семантически привязанные к файлам, а также FileVisitor методы throw IOException s.

Итак, были ли причины для параметризации FileVisitor типа?

Ответ 1

С помощью дженериков один и тот же интерфейс может использоваться для других типов путей. Как показано в следующем (упрощенном) фрагменте кода, интерфейс отлично работает с java.io.File:

FileVisitResult walk(File file, FileVisitor<File> visitor)
    throws IOException
{
    if (file.isDirectory()) {
        visitor.preVisitDirectory(file, null);
        for (File child : file.listFiles()) {
            walk(child, visitor);
        }
        return visitor.postVisitDirectory(file, null);
    } else {
        return visitor.visitFile(file, null);
    }
}

Ответ 2

Используете ли вы GitHub? Это была бы прекрасная возможность использовать FileVisitor для реализации API для GitHub, который позволит вам исследовать/визуализировать проекты GitHub. В этом отношении практически любая система SCC может использовать другой класс в качестве локатора файлов

А как насчет использования FileVisitor<ZipEntry> для перемещения zip файлов.

Если API потенциально можно использовать с несколькими объектами в качестве своей цели, имеет смысл сделать его общим. Я думаю, что не, чтобы сделать его общим, было бы ошибкой, которую следует считать глупым.