通用所需的强制转换

时间:2013-11-22 10:39:50

标签: java generics casting

我有课:

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

谢谢。

4 个答案:

答案 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