将对象强制转换为泛型类型的正确方法

时间:2017-06-16 08:23:41

标签: java generics casting

我有一个像责任链模式这样的实现,其中常见的上下文有方法

Object getVariable(String name)

当我从上下文中获取对象时,我想用适当的验证器验证它。验证器界面:

public interface PageValidator<DTO> {

    ValidationResult validate(DTO dto);
}

所以,当我尝试做验证时

Object dtoForValidation = getDtoForValidation(delegateExecution);
        ValidationResult validationResult = getPageValidator(delegateExecution).validate(dtoForValidation);

它因编译错误而失败

incompatible types: java.lang.Object cannot be converted to capture#1 of ?

所以,我想问一下设计它的正确方法是什么? (我真的不想让验证器接受Object作为输入参数,因为它看起来很难看)

2 个答案:

答案 0 :(得分:0)

在我的头顶,您可以执行以下操作之一。

1)修改您的getDtoForValidation方法以返回DTO

2)使用ValidationResult validationResult = getPageValidator(delegateExecution).validate((DTO)dtoForValidation);

明确地投射对象

3)您提到您不希望验证器接受Object作为输入参数,但您可以这样做,并且在验证器中,首先检查对象类型。

答案 1 :(得分:0)

我的建议是改变方法getValiable(String name)。您可以将Class<T> varClass传递给此方法。你的签名将是这样的:

<T> T getVariable(String name, Class<T> varClass);

如果将此方法放在第三方库中,我建议您为此类创建一些包装器。

class Wrapper {
    private OriginalClass originalObject;

    <T> T getVariable(String name, Class<T> varClass) {
        return (T) originalObject.getVariable(name);
    }
}