Обобщение функций безопасного приведения в Java - PullRequest
1 голос
/ 06 апреля 2020

У меня есть класс 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?

1 Ответ

2 голосов
/ 06 апреля 2020

Вы можете использовать метод Class.cast:

public static <T> T safelyCast(Object value, Class<T> expectedClass) throws WrongObjectTypeException {
    if (expectedClass.isInstance(value)) {
        return expectedClass.cast(value);
    } else {
        String errorMessage = "Value was of wrong type";
        throw new WrongObjectTypeException(errorMessage, expectedClass, value.getClass());
    }
}

Я должен сказать, что не вижу особого смысла в этом WrongObjectTypeException, он не дает вам больше информации, чем ClassCastException, которое вы обычно получаете .

...