4

我有一个带有签名的方法:

public static <T, E extends PxViewFull<T> > E create(Class<T> dtoClass, Class<E> viewClass) 

当我为参数化的第二个参数调用它时,我得到类型安全警告。方法的调用:

private PxViewFull<Output40942DTO> output40813 = PxViewFull.create(Output40813DTO.class, ServiceOutputView.class);

ServiceOutputView 签名:

public class ServiceOutputView<T extends ServiceCall<?>> extends PxViewFull<T>

如何获得推断泛型类型参数以消除警告?

4

1 回答 1

0

@Paul Bellora 回答了您的问题。

ServiceOutputView.class 的类型是 Class[ServiceOutputView[?]] 并且您在调用站点的参数需要 Class[ServiceOutputView[Output40942DTO]],因此当您尝试将 Class[ServiceView[?] 传递给 Class 时,您会得到一个未经检查的方法调用异常[ServiceOutputView[Output40942DTO]] 这是您的方法类型参数告诉它所期望的。

更新:这是一种不会发出警告的安排:

public class Parameter {

    public static void main(String... args) throws Exception {

        PxViewFull<OutputDTO> output40813 = PxViewFull.create(OutputDTO.class, ServiceOutputView.class);
    }

}

class ServiceCall<X> {

}

class OutputDTO extends ServiceCall<OutputDTO> {

    public OutputDTO serviceCall() {

        // i guess i pupulate myself?
        return this;
    }
}

class PxViewFull<X> {

    private X dtoObject;
    private Class<X> dtoObjectType;

    public static <P1, P2 extends PxViewFull<?>, RESULT extends PxViewFull<P1>> RESULT create(
            Class<P1> dtoClass,
            Class<P2> viewClass) throws Exception {

        return null;
    }

    public void setDtoObjectType(final Class<X> dtoObjectType) {

        this.dtoObjectType = dtoObjectType;
    }

    public void setModel(Object o) {

        if (!dtoObjectType.isInstance(o))
            throw new IllegalArgumentException();

        this.dtoObject = dtoObjectType.cast(o);
    }

}

class ServiceOutputView<T extends ServiceCall<?>> extends PxViewFull<T> {

}

create 方法必须包含一个未经检查的强制转换,最好的办法就是在其上打一个 @SuppressWarning 并确保在该方法的 javadoc 中明确说明原因。

于 2013-09-20T06:29:29.497 回答