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