Определить функцию шаблона только для классов, производных от одной базы

Эта штука меня уже давно беспокоит. Я уже задавал вопросов раньше, но, вероятно, с плохой формулировкой и примером, который был слишком абстрактным. Так что было непонятно, о чем я на самом деле спрашивал. Я попробую еще раз. И, пожалуйста, не спешите с выводами. Я полагаю, что на этот вопрос совсем непросто ответить!

Почему я не могу иметь перечисление с параметрами универсального типа в Java?

Вопрос не в том, почему это невозможно синтаксически. Я знаю, что это просто не поддерживается. Возникает вопрос: почему разработчики JSR «забыли» или «упустили» эту очень полезную функцию? Я не могу представить себе причину, связанную с компилятором, почему это было бы невыполнимо.

Вот чем я хотел бы заняться. Это возможно в Java. Это' s способ Java 1.4 для создания безопасных перечислений:

// A model class for SQL data types and their mapping to Java types
public class DataType implements Serializable, Comparable> {
    private final String name;
    private final Class type;

    public static final DataType INT      = new DataType("int", Integer.class);
    public static final DataType INT4     = new DataType("int4", Integer.class);
    public static final DataType INTEGER  = new DataType("integer", Integer.class);
    public static final DataType    BIGINT   = new DataType   ("bigint", Long.class);    

    private DataType(String name, Class type) {
        this.name = name;
        this.type = type;
    }

    // Returns T. I find this often very useful!
    public T parse(String string) throws Exception {
        // [...]
    }

    // Check this out. Advanced generics:
    public T[] parseArray(String string) throws Exception {
        // [...]
    }

    // Even more advanced:
    public DataType getArrayType() {
        // [...]
    }

    // [ ... more methods ... ]
}

И затем вы можете использовать во многих других местах

public class Utility {

    // Generic methods...
    public static  T doStuff(DataType type) {
        // [...]
    }
}

Но это невозможно с перечислением:

// This can't be done
public enum DataType {

    // Neither can this...
    INT("int", Integer.class), 
    INT4("int4", Integer.class), 

    // [...]
}

Теперь, как я сказал. Я знаю, что эти вещи были созданы именно таким образом. enum - синтаксический сахар. Так что дженерики. Фактически, компилятор выполняет всю работу и преобразует перечисления в подклассы java.lang.Enum и дженерики в приведения и синтетические методы.

но почему компилятор не может пойти далее и разрешить общие перечисления ??

EDIT : enum - синтаксический сахар. Так что дженерики. Фактически, компилятор выполняет всю работу и преобразует перечисления в подклассы java.lang.Enum и дженерики в приведения и синтетические методы.

но почему компилятор не может пойти далее и разрешить общие перечисления ??

EDIT : enum - синтаксический сахар. Так же как и дженерики. Фактически, компилятор выполняет всю работу и преобразует перечисления в подклассы java.lang.Enum и дженерики в приведения и синтетические методы.

но почему компилятор не может пойти далее и разрешить общие перечисления ??

EDIT : Это то, что я ожидал бы от кода Java, созданного компилятором:

public class DataType extends Enum> {
    // [...]
}

13
задан Community 23 May 2017 в 10:29
поделиться