java - 尝试使用泛型时出现问题

标签 java generics

我有课

public abstract class AbstractE<T, E extends Enum<E> & Flags>
{
     public interface Flags{} /*marker interface*/
     //... 
     //other code
}

和一个接口(interface)

public interface IXYZAdapter
{
   public <E extends Enum<E> & Flags> Set<E> getFlags();
}

其中Flags是AbstractE本身定义的接口(interface)。

M 这样扩展了 AbstractE:

public class M extends AbstractE<Long, M.EF> implements IXYZAdapter
{
    public enum EF implements AbstractE.Flags{flag1, flag2}
    @Override /*from IXYZAdapter*/
    public Set<M.EF> getFlags()
    {return EnumSet.allOf(EF.class);}
    
}

现在,从主要代码中,我尝试获取接口(interface) IXYZAdapter 的句柄并调用 getFlags 方法

IXYZAdapter adapter = (IXYZAdapter)m; //where m is an instance of AbstractE
Set s = adapter.getFlags();

我在主程序的最后一行 (Set s = adapter.getFlags();) 中得到以下编译时错误

invalid inferred types for E; inferred type does not conform to declared bound(s)

inferred: AbstractE.Flags

bound(s): java.lang.Enum<AbstractE.Flags>,AbstractE.Flags

我做错了什么? 我正在使用 Java 6

编辑指定错误位置

最佳答案

试试这个:

public interface IXYZAdapter <E extends Enum<E> & AbstractE.Flags>
{
   public Set<E> getFlags();
}

public class M extends AbstractE<Long, M.EF> implements IXYZAdapter<M.EF> 
{
}

或者

Set<M.EF> s = adapter.getFlags();

问题是 Set s = adapter.getFlags();系统不知道为 IXYZAdapter 中的 E 推断哪种类型,因此 AbstractE 中的 E 不匹配。

编辑:

另一种选择可能是:

interface IXYZAdapter <E extends Enum<E> & AbstractE.Flags>
{
  public Set<? extends E> getFlags();
}

class M extends AbstractE<Long, M.EF> implements IXYZAdapter<M.EF>
{
  public enum EF implements AbstractE.Flags{flag1, flag2}
  public Set<? extends M.EF> getFlags()
  {return EnumSet.allOf(EF.class);}

}

然后调用:Set<? extends AbstractE.Flags> s = adapter.getFlags();

这将允许您在不转换的情况下获得一组标志,并强制将标志声明为枚举。

关于java - 尝试使用泛型时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5548091/

相关文章:

java - 是否有可能解决 PostgreSQL 32760 绑定(bind)参数限制?

java - 为什么我的链表不添加节点? ( java )

java - 如何在调试和 Release模式下从不同位置加载 Spring beans xml 配置

swift - 开启通用类型?

java - map <字符串,? super Number> 用于添加和 Map<String, ?用于打印的扩展 Number> 会产生错误

java - 使用泛型调用方法

java - JFreeChart x 轴刻度

java - eclipse 要求我在 finally block 中用 try/catch 包围 - 可以禁用它吗?

java - 使用一组固定类型中的一个来参数化一个类

java - 为什么不能将String类型添加到List<?>?