尝试使用泛型时出现问题

时间:2011-04-05 06:34:07

标签: java 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

已编辑以指定错误位置

2 个答案:

答案 0 :(得分:2)

试试这个:

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

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

答案 1 :(得分:0)

使用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());
    }
}