Как назначить экземпляр дочернего класса универсальному (расширяет родительский) объект? - PullRequest
0 голосов
/ 08 февраля 2019

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

public abstract MyParent {

    public static <MP extends MyParent> MP getInstance(Object... params) {
        return new MyChild(params);
    }
}

, где MyChild расширяется MyParent.Проблема в том, что компилятор не позволяет мне возвращать нового потомка, потому что "MyChild не может быть преобразовано в MP".Если я произнесу перед возвратом (return (MP) new MyChild(params);), я получу непроверенное предупреждение.

Как правильно это сделать?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Поскольку у вас

есть [три] MyChilds, и [] вы получаете другого ребенка в соответствии с параметрами

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

Конкретная связь между параметрами вашего метода и типом результата неясна, но если это зависитна все, кроме типов параметров, то все готово.В этом случае нельзя избежать броска или эквивалента в каком-либо месте.Тогда ваши лучшие варианты включают

  • , имеют метод return MyParent и принимают, что вызывающему нужно будет привести результат, если он зависит от определенного подтипа (но не иначе).

  • создать разные методы с разными именами для каждого фактического возвращаемого типа.Это избавит от необходимости вызывать вызывающего, но может потребовать предоставления исключения в случае, если данные параметры не соответствуют объекту правильного типа для вызываемого метода.

Конечно, вы также можете изменить метод так, чтобы тип возвращаемого значения был в зависимости от типов параметров.Например, вы можете

  • включить токен типа среди параметров метода.Однако для того, чтобы это служило отличным от приведения эквивалента, метод должен каким-то образом связать токен типа с другими параметрами или использовать его для подлинного выбора типа возвращаемого значения или принудительного возврата возвращаемого значения к указанному типу.
0 голосов
/ 08 февраля 2019

MP может быть любым, что расширяет MyParent, но MyChild не будет подклассом каждого подкласса MyParent.

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

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