假设我用公共类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)
中所需的类型信息。
编辑:为了阐明我的示例中容器类的功能:
我希望容器类代表一些相当原始的类似收藏的类,这应该使处理器可以检索其必须处理的项目。
这意味着ItemProcessor
和ItemProcessor
使用的类应该能够处理可加工项目(一旦从容器中检索到它们)如他们喜欢的那样(例如,将它们存储在列表或其他数据结构中)。最后,应该有可能根据特定于处理器的属性请求处理的项目。例如:
getProcessedItem(Property.MOST_RECENTLY_PROCESSED)
就像Java的标准收集类(例如ArrayList
)Container<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()
方法,该方法没有生成任何警告...
但是,您的模型是错误的。您应该向容器询问该项目,而不是任意项目处理器。您正在破坏封装。实际上,整个项目制处人都会闻到它的气味。您应该考虑一个多态性解决方案,其中对象对自己作用,而不是外部演员在外部作用对象的模型。