避免使用未检查的类型铸件来制作一类通用



假设我用公共类Processor创建一个软件包process,该类别的构造函数期望Container<I>类型的参数。Container<I>类位于我的控制之外的其他软件包中,并包含任意类型I的对象。包含项目的容器在软件包process的多个类别之间传递。

这些项目是通过接口Processable的方法处理的。process的用户可以通过方法getProcessedItem(Property property)检索它们。此方法返回带有属性property的处理的项目,该项目确保通过传递的容器包含,因此可以施放到容器的类型参数中。

示例类:

package process;
import container.Container;
public class Processor<I extends Processable> {
    private final ItemProcessor itemProcessor;
    public Processor(Container<I> container){       
        this.itemProcessor = new ItemProcessor(container);
    }
    @SuppressWarnings("unchecked")
    public I getProcessedItem(Property property){
        return (I)itemProcessor.getProcessedItem(property);
    }
}

在这种情况下,将不受组织的类型铸造是一个好主意吗?

到目前为止,我发现的唯一合理的替代方案是使process中的所有类都必须对参数化容器进行引用(例如ItemProcessor),也仅仅是为了保留getProcessedItem(Property property)中所需的类型信息。

编辑:为了阐明我的示例中容器类的功能:

我希望容器类代表一些相当原始的类似收藏的类,这应该使处理器可以检索其必须处理的项目。

这意味着ItemProcessorItemProcessor使用的类应该能够处理可加工项目(一旦从容器中检索到它们)如他们喜欢的那样(例如,将它们存储在列表或其他数据结构中)。最后,应该有可能根据特定于处理器的属性请求处理的项目。例如:

getProcessedItem(Property.MOST_RECENTLY_PROCESSED)

就像Java的标准收集类(例如ArrayListContainer<I>不严格保证它仅包含I及其后代。这意味着一旦容器的项目用作Processable,而实际上不是Processable,则会发生铸造异常。

在处理器类的版本中,当通过getProcessedItem请求的项目与I类型不兼容时(由于未经检查的铸件)不兼容。而且,如果我制作了ItemProcessor通用(ItemProcessor<I>),并将其getProcessedItem返回i而不是使用未检查的铸件,那么此时也不例外。因此,我也不确定使用getProcessedItem中的Class<I>对象进行运行时类型检查是否更好。Class<I>对象必须由呼叫者明确用作参数或通过给定的容器。我觉得确保容器中的项目实际上与I兼容,这不应该是处理器的关注,因为处理器对给定容器内容的有效性不承担任何责任。

我认为您的抑制作用击败了仿制药的目的。您应该做的是使得对项目进行通用。

public class ItemProcessor<I extends Processable> {
    public I getProcessedItem() {
       return somethingWhichIsProcessable;
    }

Class类具有cast()方法,该方法没有生成任何警告...

但是,您的模型是错误的。您应该向容器询问该项目,而不是任意项目处理器。您正在破坏封装。实际上,整个项目制处人都会闻到它的气味。您应该考虑一个多态性解决方案,其中对象对自己作用,而不是外部演员在外部作用对象的模型。

最新更新