【发布时间】:2015-08-02 21:27:32
【问题描述】:
以下给出此错误:
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();
...
}
}
我目前通过在对accounts.values() 的调用周围添加Collections.class.cast() 并添加@SuppressWarnings 来解决DB_Imp 类中的编译器错误。肯定有更好的办法。另一种方法是将Cache类修改为:
@SuppressWarnings("unchecked")
public <T> Collection<T> values()
{
return Collections.class.cast(m_contents.values());
}
【问题讨论】:
-
什么版本的Java?他们在 Java 8 中改进了类型推断,上面没有给出警告。
-
javac 1.8.0_45 如果没有强制转换,编译器会给出错误而不是警告。然而,通过演员阵容,
Collection<DBAccount>可以分配给Collection<Monkey>
标签: java generics unchecked incompatibletypeerror