Как вернуть унаследованный объект при хранении с использованием родительского имени класса в Java - PullRequest
0 голосов
/ 22 сентября 2019

Я пытаюсь создать Помощника.В моём приложении может быть много библиотек. После создания экземпляра я хочу создать фабрику, которая сможет совместно использовать экземпляр между классами, например:

public ArrayList<Helper> helper = new ArrayList<>(asList(
    new Helper(SomeLib.class, new SomeLib()),
    new Helper(SomeOtherLib.class, new SomeOtherLib())
));

Мой класс библиотеки является стандартным на данный момент для тестирования этой работы..

class Library {
    public Library() { System.out.println("Instance is working"); }
}

Пример библиотеки, которую я пытаюсь заставить работать, выглядит следующим образом:

public class ExampleLib extends Library {
    public void test() { System.out.println("Test OK"); }
}

Мой текущий класс Helper выглядит следующим образом, однако я не могу привести библиотеку обратно кисходный унаследованный класс, я пробовал несколько вещей:

import dreambot.libs.Library;

public class Helper {
    private Library lib;
    private Class<? extends Library> name;

    public Helper(Class<? extends Library> name, Library lib) {
        this.name = name;
        this.lib = lib;
    }

    public Class<? extends Library> getName() { return name; }
    public <Library> Library getLib() {
        // All the things I've tried to do
        return (this.name) lib;
        return name.cast(lib);
        return lib.getClass().cast(lib);
    }
}

В свою очередь, я хочу получить следующее:

public ArrayList<Helper> helper = new ArrayList<>(asList(
    new Helper(ExampleLib.class, new ExampleLib()),
));

public void test() {
    Arrays.stream(helper.toArray()).filter(c -> c.getName(ExampleLib.class)).getFirst().ifPresent(h -> {
        h.getLib().test(); // Should output "Test OK"
    });

Ошибки, которые я получаю в своей среде IDE в Helper::getLibиспользуются следующие методы:

Не указано для return (this.name) lib;

Требуются несовместимые типы: Библиотека, Найдено: dreambot.libs.Library для return lib.getClass().cast(lib); и return name.cast(lib);

Любая помощь будет оценена.

1 Ответ

1 голос
/ 22 сентября 2019

Попробуйте:

import dreambot.libs.Library;

public class Helper<T extends Library> {
    private T lib;
    private Class<T> name;

    public Helper(Class<T> name, Library lib) {
        this.name = name;
        this.lib = lib;
    }

    public Class<T> getName() { return name; }
    public T getLib() {
        return lib;
    }
}

или даже simipler:

import dreambot.libs.Library;

public class Helper<T extends Library> {
    private T lib;

    public Helper(Library lib) {
        this.lib = lib;
    }

    public Class<T> getName() { return lib.getClass(); }
    public T getLib() {
        return lib;
    }
}

и не забывайте об операторе diamond во время вызова конструктора:

public ArrayList<Helper> helper = new ArrayList<>(asList(
    new Helper<>(SomeLib.class, new SomeLib()),
    new Helper<>(SomeOtherLib.class, new SomeOtherLib())
));

, который можетбыть упрощенным до:

public ArrayList<Helper> helper = new ArrayList<>(asList(
    new Helper<>(new SomeLib()),
    new Helper<>(new SomeOtherLib())
));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...