Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.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_Casting - Fatal编程技术网

Java 铸造所需的通用

Java 铸造所需的通用,java,generics,casting,Java,Generics,Casting,我有一门课: class ColumnBuilder < C extends ICompositeColumn > implements IColumnBuilder < C , List < ColumnNameComponent > > { @Override public C getColumn(List<ColumnNameComponent> columnNameComponents) { Collec

我有一门课:

class ColumnBuilder < C extends ICompositeColumn > implements IColumnBuilder < C , 
List < ColumnNameComponent > > {

    @Override
    public C getColumn(List<ColumnNameComponent> columnNameComponents) {
        Collections.sort(columnNameComponents);
        C compositeColumn = (C)new CompositeColumnImpl();

        for (ColumnNameComponent component : columnNameComponents){
            compositeColumn.add(component.getOrdinal(),component.getValue());
        }
        return  compositeColumn;
    }

谢谢。

因为您声明了
C扩展ICompositeColumn
。这意味着扩展
ICompositeColumn
的每个类型都可以绑定到
C
,而您的类型
compositecolumnpl
只是其中之一

考虑一下这个子类

public class SubColumnBuilder extends ColumnBuilder<AnotherCompositeColumnImpl> {
}

public class AnotherCompositeColumnImpl implements ICompositeColumn{
}
公共类子ColumnBuilder扩展ColumnBuilder{
}
公共类AnotherCompositeColumnImpl实现ICompositeColumn{
}

我假设编译器不知道
C
是否等于或大于
CompositeColumnImpl
,它可能只知道它们都实现了接口

因此,铸造是必要的


如果您的返回类型是
ICompositeColumn
,则它将不使用强制转换。

C
可以是实现
ICompositeColumn
的任何类型,而不仅仅是
CompositeColumnImpl
。通过强制转换到
C
,您不是在强制转换到
ICompositeColumn
。因此,它不能是隐式强制转换,因为它不是向上强制转换。

C
的类型可能与
CompositeColumnImpl
的类型不同

它可以是实现
ICompositeColumn
的任何类,例如
someothercompositecolumnpl

public class SubColumnBuilder extends ColumnBuilder<AnotherCompositeColumnImpl> {
}

public class AnotherCompositeColumnImpl implements ICompositeColumn{
}