Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过使用未经检查的类型转换避免类泛型化_Java_Generics_Unchecked Cast - Fatal编程技术网

Java 通过使用未经检查的类型转换避免类泛型化

Java 通过使用未经检查的类型转换避免类泛型化,java,generics,unchecked-cast,Java,Generics,Unchecked Cast,假设我使用一个公共类处理器创建了一个包进程,它有一个构造函数,该构造函数需要一个类型为容器的参数。类容器位于我无法控制的另一个包中,包含任意类型的对象I。包含项目的容器在包进程的多个类之间传递 通过接口Processable的方法处理项目。process的用户可以通过方法getProcessedItem(Property属性)检索它们。此方法返回一个具有属性property的已处理项,该属性确保被传递的容器包含,因此可以转换为容器的type参数 示例类: package process; im

假设我使用一个公共类
处理器创建了一个包
进程
,它有一个构造函数,该构造函数需要一个类型为
容器
的参数。类
容器
位于我无法控制的另一个包中,包含任意类型的对象
I
。包含项目的容器在包
进程的多个类之间传递

通过接口
Processable
的方法处理项目。
process
的用户可以通过方法
getProcessedItem(Property属性)
检索它们。此方法返回一个具有属性
property
的已处理项,该属性确保被传递的容器包含,因此可以转换为容器的type参数

示例类:

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);
    }

}

与java的标准集合类(例如,
ArrayList
)一样,
Container
并不严格保证它只包含
I
及其子体。这意味着一旦容器的某个项用作可处理的,而实际上不是可处理的,就会发生强制转换异常


在上述Processor类的版本中,当通过
getProcessedItem
请求的项与类型
I
不兼容时(由于未选中强制转换),不会立即引发异常。但是,如果我将
ItemProcessor
设置为generic(
ItemProcessor
),并使其
getProcessedItem
返回I,而不是使用未检查的强制转换,则不会在该点引发异常。因此,我也不确定是否最好使用
getProcessedItem
中的
Class
对象进行运行时类型检查。调用方必须将
对象作为参数或通过给定的容器显式提供服务。我觉得处理者不应该担心容器中的项目是否与
I
兼容,因为处理者不对给定容器内容的有效性负责

我认为你的警告违背了泛型的目的。您应该做的是使getProcessed项也是通用的

public class ItemProcessor<I extends Processable> {
    public I getProcessedItem() {
       return somethingWhichIsProcessable;
    }
公共类项目处理器{
公共I getProcessedItem(){
返回一些需要处理的东西;
}

类的
上有一个
cast()
方法,该方法不会生成警告


但是,你的模型是错误的。你应该向容器请求这个项目,而不是一个任意的项目处理器。你正在破坏封装。实际上,整个IT处理器嗅到它的味道。你应该考虑一个多态的解决方案,其中对象对自身起作用,而不是一个外部演员对外部对象起作用的模型。

Container
是否只接受
Processable
及其子体?如果不接受,可能包装模板
I
会更好。.“像java的标准集合类(例如ArrayList)一样,容器并不严格保证它只包含I”ArrayList肯定能保证吗?
List l=new ArrayList();l.add(4);List ls=(List)l;
给出了一个包含整数的字符串列表。
public class ItemProcessor<I extends Processable> {
    public I getProcessedItem() {
       return somethingWhichIsProcessable;
    }