繁体   English   中英

尝试使用泛型时出现问题

[英]Problem when trying to use generics

我上课了

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

和一个界面

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

Flags是AbstractE本身定义的接口。

因此,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);}

}

现在,从主代码中,我尝试获取接口IXYZAdapter并调用getFlags方法

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

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

E的无效推断类型; 推断类型不符合声明的边界

 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(); Set<? extends AbstractE.Flags> s = adapter.getFlags();

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

使用thomas提供的第一个解决方案,可以像这样编写主要方法,以便在不必了解枚举类型的情况下成为无警告:

public static void main(String[] args) {
    M m = new M();
    IXYZAdapter<?> adapter = (IXYZAdapter<?>)m;
    Set<?> flags = adapter.getFlags();
    Iterator<?> it = flags.iterator();

    while(it.hasNext()) {
        System.out.println(it.next());
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM