Java 当参数是参数化类的参数化后代时,键入安全警告

Java 当参数是参数化类的参数化后代时,键入安全警告,java,generics,Java,Generics,我有一个带签名的方法: public static <T, E extends PxViewFull<T> > E create(Class<T> dtoClass, Class<E> viewClass) public class ServiceOutputView<T extends ServiceCall<?>> extends PxViewFull<T> publicstatice创建(类dtoCl

我有一个带签名的方法:

public static <T, E extends PxViewFull<T> > E create(Class<T> dtoClass, Class<E> viewClass) 
public class ServiceOutputView<T extends ServiceCall<?>> extends PxViewFull<T>
publicstatice创建(类dtoClass,类viewClass)
当我为参数化的第二个参数调用它时,我得到类型安全警告。方法的调用:

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

public static <T, E extends PxViewFull<T> > E create(Class<T> dtoClass, Class<E> viewClass) 
public class ServiceOutputView<T extends ServiceCall<?>> extends PxViewFull<T>

公共类服务输出视图@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> {

}
公共类参数{
公共静态void main(字符串…参数)引发异常{
PxViewFull output40813=PxViewFull.create(OutputDTO.class,ServiceOutputView.class);
}
}
类服务调用{
}
类OutputDTO扩展ServiceCall{
公共输出到serviceCall(){
//我想我是在骗自己吧?
归还这个;
}
}
类PxViewFull{
私有X数据对象;
私有类dtoObjectType;
公共静态>扩展PxViewFull{
}

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

注意
ServiceOutputView.class
仅指向
class
,其中
ServiceOutputView
是原始类型。可以吗你给出了一个最简单的运行代码示例?你的问题在哪里重现?@mike你所需要的已经在帖子中了:只需创建带有所描述签名的空类/方法,并尝试创建所描述的字段。我理解,但问题是:是否存在一种以这种方式声明所有内容而不获取类型安全警告的方法?通常是p可能会参数化类/方法或使用?以避免收到警告。但在这种情况下,我找不到任何方法来做到这一点。对于您使用的结构,您将不得不执行一些“不安全”的操作最终不管怎样,因为在这种设计中没有足够的类型信息跨层传输。Java泛型!=模板,并且没有具体化。