我有课:
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;
}
类CompositeColumnImpl实现ICompositeColumn接口 那么为什么编译器需要在这一行中放置cassting:
C compositeColumn = (C)new CompositeColumnImpl();
谢谢。
答案 0 :(得分:5)
因为您声明了C extends ICompositeColumn
。这意味着扩展ICompositeColumn
的每种类型都可以绑定到C
,而您的类型CompositeColumnImpl
只是其中之一。
想想这个子类
public class SubColumnBuilder extends ColumnBuilder<AnotherCompositeColumnImpl> {
}
public class AnotherCompositeColumnImpl implements ICompositeColumn{
}
答案 1 :(得分:0)
我假设编译器无法知道C
是等于还是超CompositeColumnImpl
,它可能只知道它们都实现了接口。
因此,演员是必要的。
如果您的返回类型为ICompositeColumn
,则无需强制转换即可生效。
答案 2 :(得分:0)
C
可以是实现ICompositeColumn
的任何类型,而不仅仅是CompositeColumnImpl
。通过转换为C
,您不会投射到ICompositeColumn
。所以它不能是一个隐含的演员,因为它不是一个向上的。
答案 3 :(得分:0)
C
的类型可能与CompositeColumnImpl
不同。
它可以是任何实现ICompositeColumn
的类,例如SomeOtherCompositeColumnImpl