Java - 正确的矢量对象切片<>



以下代码有效,但我收到编译器警告"参数化类"Vecor"的原始使用;。那么java允许对象切片,但仍然会发出编译器警告?有更优雅的解决方案吗?

public class Derived extends Base {}
Vector<Derived> getVectorOfDerived();
Vector<Base> getVectorOfgetBase();
...
Vector<Base> v = DO_TEST ? (Vector<Base>) (Vector) getVectorOfDerived() : getVectorOfgetBase();

背景:这是为数不多的对象切片对我来说有意义的情况之一:"衍生的";是专用于生产数据的测试数据";基本";。"衍生的";具有相同的行为特征(变量、函数(;"基础";,但的行为不同。将所有测试材料放入";基本;类会使代码变得混乱。

编辑:Thx,矢量<?扩展基础>编译时没有错误,但我有很多函数f(Vector v(。这些不能再这样称呼了。旧的强制转换(Vector<Base>((Vector(有效。Java定义了";公共类Vector<E>";,因此,在这一点上,类显然是明确定义的。也许预期的方法是切换到类似公共同步布尔值addAll(Collection<?extends E>c(的函数?

class Base{}
class Derived extends Base{}
...
void f1(Base b) {}
void f2(Vector<Base> v) {}
...
Derived d = ...
Vector<Derived> vd = ...
Vector<? extends Base> vdb = ...
f1(d); // ok
f2(vd) // error 
f2(vdb) // error 
f2((Vector<Base>) vdb); // ok, but wrong hint "Cast may be removed..."
f2(vd); // error
f2((Vector<Base>)vd); //error
f2((Vector<Base>)(Vector)vd); // Warning "Raw use of parameterized Class Vector"
// solution? Too awkward:
vb.addAll(vd); // ok
f2(vb);

尝试这样定义v

Vector<? extends Base> v = DO_TEST ? getVectorOfDerived() : getVectorOfgetBase();

这里v将是Base对象或从Base继承的对象(例如Derived(的向量。

如下声明f2,然后删除所有强制转换。

void f2(Vector<? extends Base> v) {}

最新更新