У меня есть класс Java, который не делает ничего, кроме безопасного приведения нескольких объектов к ожидаемым классам, и возвращает описательное сообщение об ошибке в случае сбоя приведения. Все они выглядят так:
public static RequirementId castToRequirementID(Object value) throws WrongObjectTypeException {
Class<?> expectedClass = RequirementId.class;
Class<?> actualClass = value.getClass();
if(actualClass == expectedClass) {
RequirementId requirementID = (RequirementId) value;
return requirementID;
}
String errorMessage = "Value was of wrong type";
throw new WrongObjectTypeException(errorMessage, expectedClass, actualClass);
}
public static RequirementProjectInformation castToRequirementProjectInformation(Object value) throws WrongObjectTypeException {
Class<?> expectedClass = RequirementProjectInformation.class;
Class<?> actualClass = value.getClass();
if(actualClass == expectedClass) {
RequirementProjectInformation requirementProjectInformation = (RequirementProjectInformation) value;
return requirementProjectInformation;
}
String errorMessage = "Value was of wrong type";
throw new WrongObjectTypeException(errorMessage, expectedClass, actualClass);
}
Как видите, эти функции в основном идентичны, за исключением того, что мне нужно изменить expectedClass
в первой строке каждой функции и приведение в четвертой строке каждой функции. Это заставляет меня хотеть обобщить это некоторым способом, например:
public static MongoDB_ObjectAddress safelyCast(Object value, Class<?> expectedClass) throws WrongObjectTypeException {
Class<?> actualClass = value.getClass();
if(actualClass == expectedClass) {
expectedClass castedObject = (expectedClass) value;
return castedObject;
}
String errorMessage = "Value was of wrong type";
throw new WrongObjectTypeException(errorMessage, expectedClass, actualClass);
}
Однако вышеприведенное утверждение не работает, так как я не могу использовать expectedClass
вместо фактического имени класса в объявлении и актеры.
Есть какой-нибудь умный способ сделать это? Или это просто невозможно в Java?