Сбой происходит в JDBCStoreManager в методе setInverseRelation в следующем коде:
ClassMapping cm =
(ClassMapping) _conf.getMetaDataRepositoryInstance().getCachedMetaData(pc.getClass());
FieldMapping[] fmd = cm.getFieldMappings();
cm имеет значение null и поэтому cm.getFieldMappings () аварийно завершает работу. ClassMapping отсутствует в кэше метаданных. По какой-то причине кеш имеет только оригинальные классы, но pc.getClass возвращает класс ENHANCED. Очень похоже на ошибку в Open JPA. Кто-нибудь может это подтвердить?
Если "возвратом вводят полиморфизм", Вы означаете перегружаться на основе типа возвращаемого значения, я не уверен в других языках, но для C++ вот ответ (в значительной степени из первых уст):
Функциональные типы возврата не играют роли в разрешении перегрузки просто, потому что Stroustrup (я принимаю с входом от других архитекторов C++), требуемое разрешение перегрузки, чтобы быть 'независимым контекстом'. См. 7.4.1 - "Перегрузка и Тип Возврата" с "Языка Программирования на C++, Третий Выпуск".
Причина состоит в том, чтобы сохранить разрешение для отдельного оператора или вызова функции независимым от контекста.
Они хотели, чтобы это базировалось только о том, как перегрузку назвали - не, как результат использовался (если это использовалось вообще). Действительно, много функций вызваны, не используя результат, или результат использовался бы в качестве части большего выражения. Один фактор, что я уверен, сыграл роль, когда они решили, что это было то, что, если бы тип возврата был частью разрешения, было бы много вызовов к перегруженным функциям, которые должны были бы быть разрешены со сложными правилами или должны будут иметь бросок компилятора ошибка, что вызов был неоднозначен.
И, Господь знает, разрешение перегрузки C++ достаточно сложно как есть...
я хотел бы видеть эту функцию на некотором языке, не только так, чтобы функциональное нечто могло возвратить двойное или интервал или строку, но также и так, чтобы нечто могло возвратить структуру или объекты различных классов. Устранение неоднозначности вызовов было бы довольно тривиально - если вызов неоднозначен, потребуйте, чтобы бросок выбрал желаемый тип возврата. Пример:
string s = foo(); //foo returns a string
double x = foo(); //foo returns a double
int i = foo(); //foo returns an integer
float f = (float)(int)foo(); //call the int foo and convert to float
кроме того,
Animal a = fooFactory(); //fooFactory returns an Animal
Plant p = fooFactory(); //foofactory returns a Plant
эти ситуации не подходят очень часто, но когда они делают обходное решение часто довольно ужасно...
double x = (double)foo();
Вышеупомянутое неоднозначно, если существуют версии нечто (), который может возвратиться дважды, интервал, плавание, и т.д.
В C++ можно сделать это с классами в большой степени. Например, скажите, что у меня есть тип данных, который обычно преобразовывается в ASCII на вводе и выводе;
typedef char* pchar;
class MyType
{
public:
operator pchar() { return(ConvertToASCII()); }
MyType& operator=(char* input) { ConvertFromASCII(input); return(*this); }
pchar ConvertToASCII();
void ConvertFromASCII(pchar ASCII);
}
Этот тип вещи часто используется в платформах C++. Например, взгляните на implmentation класса CString MFC. По моему скромному мнению, это - очень полезный инструмент, хотя опасный при определенных обстоятельствах.
Из-за автопреобразования типов не очевидно знать, какую функцию вызвать, когда типы возврата близки.