я продолжаю возвращаться к вариантам этой проблемы: она, вероятно, имеет очень простое решение, но я не могу понять это ...Возвратившись объект подкласса от суперкласса метода
У меня есть куча классов вида xQuantity, например DistanceQuantity, AreaQuantity и т. Д., Которые расширяют класс DimensionQuantity. Теперь вы можете добавлять или вычитать свойства DistanceQuantity или AreaQuantity и т. Д., Но вы не можете их смешивать, поэтому я думаю, что мне нужно иметь (короткие) методы добавления, вычитания и т. Д. В подклассах, но я хочу уменьшить любую логику дублирования до минимума. Однако мне нужно вернуть объект подкласса, и это сложно сделать из метода суперкласса. Я считаю, что это можно сделать с помощью рефлексии, но AFAIK вам все равно нужно сделать бросок в конце в методе подкласса, и мне говорят, что отражение может быть дорогостоящим ... Самое лучшее, что я придумал до сих пор:
В DistanceQuantity (и другие подобные им):
public DistanceQuantity() {
}
public DistanceQuantity add(DistanceQuantity d1) {
DistanceQuantity dn = new DistanceQuantity();
Object o = super.add(dn, this, d1, DistanceUnit.REF_UNIT);
return (DistanceQuantity) o;
}
В DimensionQuantity (минус некоторые менее соответствующие заявления):
public Object add(DimensionQuantity dn, DimensionQuantity d1, DimensionQuantity d2,
AbstractUnit au) {
dn.unit = au;
dn.scalar = d1.scalar + d2.scalar;
dn.units = dn.scalar;
return dn;
}
Можно ли придумать более экономной код - это еще тип- безопасно? ТИА
Лучше (яснее, когда у вас много дженериков), чтобы назвать дженерики чем-то ближе к T_DimensionQuantity – Egwor
Вы забыли абстрактное ключевое слово. ;) Просто использование «Т» довольно стандартная практика, я думаю. – Michael
@mangst спасибо, теперь он абстрактный. @Egwor, как сказал @mangst, T распространен. T для типа, в коллекции это E для элемента, в Map это K и V для ключа и значения. Обычно это первая буква вашего родословного значения. –