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{
}