Java 错误:不兼容的类型:集合<;DB_账户>;无法转换为集合<;帐户>;

Java 错误:不兼容的类型:集合<;DB_账户>;无法转换为集合<;帐户>;,java,generics,unchecked,incompatibletypeerror,Java,Generics,Unchecked,Incompatibletypeerror,下面给出了此错误: public class Account { ... } public class DB_Account extends Account implements DBObject { ... } public class Cache<E extends DBObject> { protected Map<Long,E> m_contents; ... public Collection<E> v

下面给出了此错误:

public class Account
{
    ...
}

public class DB_Account extends Account implements DBObject
{
    ...
}

public class Cache<E extends DBObject>
{
    protected Map<Long,E> m_contents;

    ...

    public Collection<E> values()
    {
        return m_contents.values();
    }
}

public class DB_Imp implements Database
{
    protected Cache<DB_Account> m_accounts;

    ...

    @Override
    public Collection<Account> getAccounts()
    {
        if (m_accounts.isValid())
            /* Compiler gives error here */
            return m_accounts.values();
        ...
    }
}

问题是您试图将
集合
作为
集合
返回,编译器不允许您这样做<代码>集合不是协变的,因此
集合
不是
集合
的子类型

解决此问题的方法是将
数据库中的
方法修改为:

Collection<? extends Account> values();

Collection首先查看错误。据说:

  • 对于
    Cache m_accounts
    ,方法调用
    m_accounts.values()
    返回一个
    集合
  • Ands
    getAccounts()
    返回
    集合

    可能的解决方案 如果不知道确切的背景,很难提出解决方案。如果您能够更改
    数据库
    接口,一种可能的方法是将
    getAccounts
    更改为使用通配符

    public Collection<? extends Account> getAccounts();
    

    public collection什么版本的Java?他们改进了Java8中的类型推断,上面的代码在这里没有给出警告。JavaC1.8.045如果没有强制转换,编译器会给出错误而不是警告。但是,通过强制转换,
    集合
    可以被分配到一个
    集合
    可能的副本,不幸的是,这将重写一个现有的库,并相应地编辑我的答案
    @Override
    public Collection<Account> getAccounts() {
        if (m_accounts.isValid())
          return Collections.unmodifiableCollection(m_accounts.values());
        ...
    }
    
    public Collection<? extends Account> getAccounts();