Неизвестная ошибка класса при попытке внедрения зависимости - PullRequest
0 голосов
/ 02 июля 2018

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

У меня есть два интерфейса: DataParserImplementation и ObjectImplementation. У меня есть классы, которые реализуют каждый: SalesRepbyId реализует DataParserImpl (он анализирует данные в объекты и помещает эти объекты в коллекции). SalesRep реализует Objectimpl (это объект для определенного набора данных).

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

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

Вот код с которым он перестает работать:

РЕДАКТИРОВАТЬ: ревизии на основе комментариев: я хочу указать тип DataObject (D), который мой класс использует, передавая его через конструктор через общий интерфейс и используя универсальные типы. Когда я пытаюсь использовать его вместо конкретного реализующего класса, я получаю ошибку. Я не могу найти ничего об этой ошибке.

   public class SalesRepbyId<D extends ObjectImplementation> implements DataParserImplementation<Map<String,D>> {
private FileParserImplementation<ArrayList<String[]>> FileParser;
private D dataObject;

public SalesRepbyId(FileParserImplementation<ArrayList<String[]>> FileParser,D d){
    this.FileParser = FileParser;
    this.dataObject = d;
}
@Override
public Map<String, D> Parse() {

    try{
        //reads the file and returns an array of string arrays
        ArrayList<String[]> Salesrep_contactlist =  FileParser.ReadFile;
        //here it still says "Unknown Class." that's the problem
        Map<String, dataObject> SalesrepByIdMap = new HashMap<>();
  //I want to be able to put in any class that implements 
  //dataObject into this class and have it run the same way.

1 Ответ

0 голосов
/ 11 июля 2018

Краткое изложение того, что я сделал

Я реализовал шаблон Factory Design и создал файл properties, который позволил мне отразить в классе, который я хотел, вместо того, чтобы пытаться использовать универсальный тип DataObject (или D).

Детали решения

Отражение класса с использованием файла свойств "config.properties" и последующее приведение его к типу Objectimplementation позволило мне использовать любой класс, который реализовал этот интерфейс (и был реализован в Factory и установлен в файле properties) , Затем я реорганизовал все экземпляры D для ввода ObjectImplementation, поскольку родительский интерфейс - это необходимый здесь уровень абстракции, а не универсальный конкретный класс.

Почему это не сработало так, как я попробовал в вопросе

причина, по которой универсальный тип D не работает с отражением, заключается в том, что для отражения используется конкретный тип классификации, определенный во время выполнения, а универсальный тип D указывается перед временем выполнения. Таким образом, я пытался отразить в classtype и его методах / экземплярах без должного использования отражения, и код говорил мне, что classtype был неизвестен в то время, когда я нуждался в нем.

Пример кода для сравнения с кодом вопроса

Пример рабочего кода:

public class SalesRepbyId implements 
DataParserImplementation<Map<String,ObjectImplementation>> {
    private FileParserImplementation<ArrayList<String[]>> FileParser;
    //the Factory class that creates instances of the reflected class I wanted
    private ObjectFactory Factory = new ObjectFactory();

    public Map<String, ObjectImplementation> Parse() {
        //the proeprties object which then loads properties from a file and reflects the classtype I want
        Properties prop = new Properties();
        //loading in the classtype and casting it to the subclass of ObjectImplementation that it actually is
        prop.load(SalesRepbyId.class.getResourceAsStream("config.properties"));
        Class<? extends ObjectImplementation> Classtouse = Class.forName(prop.getProperty("ObjectImplementation")).asSubclass(ObjectImplementation.class);
        //construct instances of 'Classtouse' and parse the data into these dynamically typed objects
        //return the map that holds these objects
        }
...