Как передать статический класс в качестве аргумента в Java

У меня есть базовый класс под названием "Entity", который имеет статический метод под названием" construct", который возвращает экземпляр сущности. У меня есть несколько разных подклассов этого класса (для демонстрации предположим, что у нас есть "фрукты" и "овощи" в качестве подклассов). Я хотел бы иметь возможность сделать что-то по следующим направлениям:

Entity a = someFunction(Fruit, textfile)

someFunction затем передаст textfile в Fruit.создайте и верните созданный объект. Есть ли простой способ сделать это?

7 ответов



передать Fruit.class к функции, а затем используйте отражение на этом объекте класса для вызова надлежащего конструктора. Обратите внимание, что это свяжет ваш суперкласс довольно плотно с его подклассами, требуя, чтобы конструктор существовал.


Вы имеете в виду что-то вроде этого:

public <T> T someFunction(Class<T> clazz, String textFile) throws Throwable {
 return clazz.newInstance();
}

приведенный выше код будет использовать конструктор без аргументов класса (при условии, что он есть).

Если ваш класс должен быть создан с помощью определенного конструктора, вы можете следовать этому примеру:

public <T> T someFunction(Class<T> clazz, String textFile) throws Throwable {
  // Here I am assuming the the clazz Class has a constructor that takes a String as argument.
  Constructor<T> constructor = clazz.getConstructor(new Class[]{String.class});
  T obj = constructor.newInstance(textFile);
  return obj;
}

Fruit в вашем примере это тип, а while Fruit.eat() может ссылаться на статический метод,Fruit не является "статическим классом".

есть "объект класса", который на самом деле Object это представляет класс. Лучше передай. Чтобы добраться до него, они синтаксис есть.


статические методы не наследуются сами по себе, если ваш код имеет сущность.строить.(..) он не будет динамически связывать это с подклассом.

лучший способ выполнить то, что вы просите, - использовать отражение для вызова метода construct в классе Fruit (или любом классе, который был передан в метод someFunction ().


вы пытаетесь реализовать объектно-ориентированный шаблон проектирования, стратегия, используя процессуального кодекса. Не делай этого.

вместо этого создайте интерфейс под названием EntityConstructor, который определяет способ construct(). Make Fruit и Vegetable реализовать этот интерфейс. Тогда измени someFunction() взять экземпляр этого интерфейса.


вот реализации :

public <T extends Entity> T someMethod(Class<T> entityClass, File file) throws InstantiationException, IllegalAccessException {
        T newEntity = entityClass.newInstance();
        // do something with file
        // ...
        return newEntity;
    }

стоит присмотреться