Возвратите вложенный тип класса в Java

Для файлов ORC и последовательности BLOCK__OFFSET__INSIDE__FILE не является уникальным для каждого файла, и в официальной документации говорится, что это смещение файла первого байта текущего блока

В [113 ] В некоторых ресурсах в Интернете сказано, что BLOCK__OFFSET__INSIDE__FILE является уникальным внутри текстовых файлов. Даже если это правда, почему вы должны ограничивать себя только текстовыми файлами.

Кроме того, UUID не зависит от входных файлов и может быть рассчитан после некоторого преобразования, в рабочем процессе, читающем тему Kaffka, вообще без файлов и т. Д. Также UUID, сгенерированный в какой-либо другой системе, также уникален в вашей системе, поскольку UUID глобально уникальный. Кроме того, идентификаторы UUID имеют одинаковую длину, не зависят от длины структуры файлового каталога, и INPUT__FILE__NAME содержит все пути к файлам, что делает имя файла уникальным в одной и той же файловой системе.

Вот почему UUID является предпочтительным решением

5
задан miracle2k 8 April 2009 в 18:04
поделиться

2 ответа

Generics and covariant type overriding do not work very well together. You have to explicitly declare getTileClass() as returning a class that can be a subclass of A.Tile.

You also can access the class object of MyTile without instanciating it, with MyTile.class.

Try this instead:

public abstract class A {
    public static interface Tile;

    protected abstract Class<? extends Tile> getTileClass();
}

public class B extends A {
    public static class MyTile implements A.Tile { }

    @Override
    protected Class<MyTile> getTileClass() {
        return MyTile.class;
    }
}

Even better would be to make A generic. You still have to use extends in the class type definition, but you can be a bit more specific:

public abstract class A<T extends A.Tile> {
    public static interface Tile;

    protected abstract Class<? extends T> getTileClass();
}

public class B extends A {
    public static class MyTile implements A.Tile { }

    @Override
    protected Class<MyTile> getTileClass() {
        return MyTile.class;
    }
}
6
ответ дан 14 December 2019 в 19:25
поделиться
public abstract class A {
    public static interface Tile {};

    // I return something that is-a Tile
    protected abstract Tile getTileClass();
}

public class B extends A {
    public static class MyTile implements A.Tile { }

    @Override
    protected abstract Tile getTileClass() {
        return new MyTile();
    }
}

Нет необходимости в генериках, вы просто хотите сказать, что возвращаете подкласс Tile или Tile.

Между прочим, открытый статический интерфейс в классе - это «запах кода»; либо сделайте его защищенным, чтобы только подклассы A могли реализовать Tile, либо поместите его в собственный интерфейс верхнего уровня. Вставка, но позволяющая кому-либо это реализовать, отправляет смешанное сообщение.

-1
ответ дан 14 December 2019 в 19:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: