首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在数组中正确使用协方差

问在数组中正确使用协方差
EN

Stack Overflow用户
提问于 2011-02-13 10:06:37
回答 6查看 300关注 0票数 4

基类有一个数据成员,它是一个对象A[]数组和一个用于该对象的访问器方法。我希望能够重写访问器以返回B[],其中B是A的子类。

在Java5.0中,它将允许我这样做,因为数组是协变的,但当我尝试如下所示时,我得到了一个ClassCastException:

代码语言:javascript
复制
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

EN

回答 6

Stack Overflow用户

发布于 2011-02-13 10:21:18

如果只是

代码语言:javascript
复制
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();
    }
}
票数 2
EN

Stack Overflow用户

发布于 2011-02-13 10:30:01

不可能。

您可以使用List<A>,将其转换为List<B>,或者使用通用的List<T>。性能应该非常接近数组。

票数 2
EN

Stack Overflow用户

发布于 2011-02-13 10:31:04

请看我在你的问题中发布的评论。但是,如果我对你的问题的理解是正确的,那么以下是适用的:

A不是B的子类型,这就是你得到异常的原因。基于你正在尝试做的事情,它不会起作用。

我想出了一个解决方案,可以满足你的需求。进入界面的美丽概念!=D

代码语言:javascript
复制
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;
    }
}

现在,因为它们共享一个公共接口。这会像你想要的那样工作。

您将需要公开允许您通过该类型使用它们的方法,或者,当使用它们时,您必须求助于强制转换。这就是缺点

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4981987

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档