Как проверить валидность класса с помощью универсального класса - PullRequest
0 голосов
/ 22 октября 2018

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

Например, у меня есть Base и Derived1, Derived2, и я помещаю их в Class [] {Derived1.class, Derived2.class}, и я передаю этот массив конструктору класса.

В этом конструкторе мне нужно создавать экземпляры этих производных классов, и я не знаю, как это сделать, потому что я получаю информацию о том, что Class и Base несовместимы.

Вот мой пример кода

public abstract class Base {
public abstract Base create(String s);
}

public class Derived extends Base {
java.lang.Integer value;
private static Derived integer = new Derived();

public static Derived getInstance(){
    return integer;
}

public Base create(String s) {
    value = java.lang.Integer.parseInt(s);
    return this;
}
}

public class Clazz {
Class<? extends Base> type;
ArrayList<Base> arrayList;

public Class<? extends Base> getType() {
    return type;
}
}


public class AnotherClazz{

ArrayList<Clazz> clazzArrayList;
Class<? extends Base>[] types;

AnotherClazz(Class<? extends Base>[] args){
    clazzArrayList = new ArrayList<>();
    types = args; // assuming I pass 2 elements in array
    String[] strings = new String[]{"1","2"};
    for (int i=0; i<args.length; ++i){
        if (types[i] instanceof Base){
            // here i want to check validity of class
        }
    }

    for (int i=0; i<strings.length; ++i){
        clazzArrayList.get(i).arrayList.add(((types[i]) Base).getInstance().create(strings[i])); 
    //here i want to create instance of object from type assigned to specific column
    }
}

Спасибо за помощь.

Ответы [ 3 ]

0 голосов
/ 22 октября 2018

Если я правильно прочитал вопрос, вы хотите создать несколько экземпляров производных классов, которые имеют одинаковые аргументы конструктора.Если это так, то вам нужно предоставить каждому производному классу один и тот же конструктор (он не обязательно должен быть в базовом классе) и использовать Constructor.newInstance (параметры) для создания экземпляров.Кроме того, поскольку вы хотите убедиться, что каждый производный класс расширяет базовый класс, вы захотите использовать Class.isAssignableFrom (class).Например,

import java.lang.reflect.Constructor;

public class SO52930530 {

    public abstract static class Base {

        public abstract <T> T getValue();
    }

    public static class Derived1 extends Base {

        String value;

        public Derived1(String value) {
            this.value = value;
        }

        public <T> T getValue() {
            return (T) value;
        }
    }

    public static class Derived2 extends Base {

        Integer value;

        public Derived2(String value) {
            this.value = new Integer(value);
        }

        public <T> T getValue() {
            return (T) value;
        }
    }

    public static void main(String... args) throws Exception {

        Class<? extends Base>[] extensions = new Class[]{Derived1.class, Derived2.class};
        String[] values = new String[]{"a", "1"};
        Base[] instances = new Base[values.length];

        for (int i = 0; i < instances.length; i++) {
            Class extension = extensions[i];
            if (Base.class.isAssignableFrom(extension)) {
                Constructor constructor = extension.getConstructor(String.class);
                instances[i] = (Base) constructor.newInstance(values[i]);
            }
        }

        for (int i = 0; i < instances.length; i++) {
            System.out.printf("%d %s %s\n", i, instances[i].getClass(), instances[i].getValue());
        }
    }
}

Надеюсь, это поможет.

0 голосов
/ 22 октября 2018

Спасибо за помощь в проверке правильности (это работает!), Но я все еще не получаю это создание newInstance, потому что мне нужно читать данные из файла .csv, и мои производные классы на самом деле являются «обертками» для примитивных типов, таких как int,float и т. д., и я должен создать новый объект, используя методы getInstance () и create (string s), поэтому он выглядит так:

public static class Derived1 extends Base { //Integer wrapper

    Integer value;

    public Derived1(Integer value) {
        this.value = value;
    }

    private static Integer integer = new Integer();

    public static Integer getInstance(){
        return integer;
    }

    private Integer(){};

    public Base create(String s) {
        value = java.lang.Integer.parseInt(s);
        return this;
    }

}

, и я не знаю, как использовать Class дляприведение к типу ученика.

0 голосов
/ 22 октября 2018

Чтобы проверить правильность, попробуйте это

if (types[i].getClass().isAssignableFrom(Base.class))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...