javac 错误:具有泛型的不可转换类型?

2022-09-01 22:43:12

还有其他几个SO问题谈论泛型编译OK与Eclipse的编译器,但不是javac(即Java:泛型在Eclipse和javac中处理差异,Generics在Eclipse中编译和运行,但不在javac中编译) - 但是这看起来略有不同。

我有一个类:enum

public class LogEvent {
   public enum Type {
       // ... values here ...
   }
   ...
}

我有另一个类,它有一个方法,它接受从以下类型降级的任意对象:Enum

@Override public <E extends Enum<E>> void postEvent(
    Context context, E code, Object additionalData) 
{
    if (code instanceof LogEvent.Type)
    {
        LogEvent.Type scode = (LogEvent.Type)code;
    ...

这在 Eclipse 中工作正常,但是当我使用 进行干净构建时,我遇到了一对错误,一个在行上,另一个在转换行上:antinstanceof

443: inconvertible types
    [javac] found   : E
    [javac] required: mypackage.LogEvent.Type
    [javac]         if (code instanceof LogEvent.Type)
    [javac]             ^

445: inconvertible types
    [javac] found   : E
    [javac] required: com.dekaresearch.tools.espdf.LogEvent.Type
    [javac]             LogEvent.Type scode = (LogEvent.Type)code;
    [javac]                                                  ^

为什么会发生这种情况,我该如何解决这个问题,以便它能够正确编译?


答案 1

我不知道为什么会发生这种情况,但解决方法很简单:

@Override public <E extends Enum<E>> void postEvent(
    Context context, E code, Object additionalData) 
{
    Object tmp = code;
    if (tmp instanceof LogEvent.Type)
    {
        LogEvent.Type scode = (LogEvent.Type)tmp;
    ...

这很丑陋,但它有效...


答案 2

也许是因为你已经将E声明为扩展Enum<E>的东西。我不能说我完全理解它,但看起来它限制了类型集,因为某种原因不能包含LogEvent.Type的某个子集。或者也许它只是编译器中的一个错误。如果有人能更清楚地解释它,我会很高兴,但这是你可以做的:

public <E extends Enum<?>> void postEvent(E code) 
{
    if (code instanceof LogEvent.Type)
    {
        LogEvent.Type scode = (LogEvent.Type)code;
        ...
    }
    ...

这有效,它比仅仅投射到对象上更优雅。


推荐