基类有一个数据成员,它是一个对象A[]数组和一个用于该对象的访问器方法。我希望能够重写访问器以返回B[],其中B是A的子类。
在Java5.0中,它将允许我这样做,因为数组是协变的,但当我尝试如下所示时,我得到了一个ClassCastException:
class Business {
A[] clients;
A[] getClientList() { return clients; }
}
class DoctorBusiness extends Business {
B[] getClientList(){
return super.clients;
//this line thwoes a classcastexception
}
}其中Client对应于A,Patient对应于B,Patient extends。
我该如何解决这个问题呢?我知道数组中的所有对象都将是B类型,并且希望避免每次访问客户端的数组元素时都向下强制转换为Patient
发布于 2011-02-13 10:21:18
如果只是
class A{}
class B extends A{}
public class Test<T extends A> {
T[] t;
public T[] get()
{
return t;
}
public static void main(String args[])
{
Test<B> t2 = new Test<B>();
B[] b = t2.get();
}
}发布于 2011-02-13 10:30:01
不可能。
您可以使用List<A>,将其转换为List<B>,或者使用通用的List<T>。性能应该非常接近数组。
发布于 2011-02-13 10:31:04
请看我在你的问题中发布的评论。但是,如果我对你的问题的理解是正确的,那么以下是适用的:
A不是B的子类型,这就是你得到异常的原因。基于你正在尝试做的事情,它不会起作用。
我想出了一个解决方案,可以满足你的需求。进入界面的美丽概念!=D
public interface ICommon
{}
public class B extends A
{
protected B[] b;
public ICommon[] Get()
{
return b;
}
public ICommon[] GetAncestor()
{
return a;
}
}
public class A implements ICommon
{
protected A[] a;
public ICommon[] Get()
{
return a;
}
}现在,因为它们共享一个公共接口。这会像你想要的那样工作。
您将需要公开允许您通过该类型使用它们的方法,或者,当使用它们时,您必须求助于强制转换。这就是缺点
https://stackoverflow.com/questions/4981987
复制相似问题