Сообщая перечислению, какой тип подкласса использовать - PullRequest
0 голосов
/ 12 июня 2018

Здравствуйте, чтобы объяснить, что я пытаюсь сделать все возможное, я покажу вам

открытый класс Main {

public enum Types{
    ONE(One.class),TWO(Two.class),THREE(Three.class);

    Class<?> type;

    private Types(Class<?> type) {
        this.type = type;
    }


}

public class Manager {
    ArrayList<Number> numbers = new ArrayList<>();

    public void Load() {
        //THIS IS WHERE I AM STUCK
        //I know it can be done like this below to add them in to the array with the types
        numbers.add((One) new Number());
        numbers.add((Two) new Number());
        numbers.add((One) new Number());
        numbers.add((Three) new Number());

        //But i want to be able to add them like this.
        numbers.add(Types.ONE.type.newInstance());

    }

    public void Run() {

        if (numbers.isEmpty()) {
            Load();
        }

        for (Number n : numbers) {
            n.call();
        }
    }
}

public class Number {
    public void call() {

    }       
}

public class One extends Number {   
    @Override
    public void call() {
    }
}

public class Two extends Number {   
    @Override
    public void call() {
    }
}

public class Three extends Number { 
    @Override
    public void call() {
    }
}

}

Если вы ищете комментарии вкод, который я пытаюсь добавить «Число» в массив, но с подклассом.

Теперь это пример в приложении, я хочу, чтобы объекты имели параметры в конструкторах.Может ли кто-нибудь указать мне правильное направление.

Причина, по которой я просто не добавляю их с помощью .add, заключается в том, что в реальном приложении есть сотни возражений против добавления в список массивов, и когда ясохраните эти объекты с помощью перечисления, чтобы показать, какого они типа.Также эти объекты регулярно меняются.

1 Ответ

0 голосов
/ 12 июня 2018

В настоящее время переменная type в Types имеет тип Class<?>.Этот Class объект может представлять любой объект класса, который не обязательно находится в иерархии классов Number, которую вы создали.

Любой объект, возвращаемый newInstance, может иметь любойтип, поэтому компилятор не может отправить его на ArrayList<Number> в качестве параметра;оно может не совпадать.

Добавить верхнюю границу к типу type:

enum Types{
    ONE(One.class),TWO(Two.class),THREE(Three.class);

    // add ? extends Number here
    Class<? extends Number> type;  

    // add ? extends Number here
    private Types(Class<? extends Number> type) {  
        this.type = type;
    }
}

Вам все равно придется перехватить все исключения, связанные с отражением: IllegalAccessExceptionи InstantiationException.

Также обратите внимание, что в Java 9+ Class.newInstance устарело ;Вы должны заменить этот вызов на

getDeclaredConstructor().newInstance()

, который также выбрасывает NoSuchMethodException и InvocationTargetException.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...