【发布时间】:2011-04-05 06:34:07
【问题描述】:
我有课
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
已编辑以指定错误位置
【问题讨论】:
-
哪一行触发编译器错误?
-
当我尝试编译时,行 Set s = adapter.getFlags() - 生成错误
-
return new EnumSet.allOf(EF.class);应该是什么意思/做什么? -
我把EnumSet.allOf前面的“new”关键字去掉了,是那里打错了
-
还有你的第一行
public abstract class AbstractE<T, E extends Enum<E> & Flags>给了我编译器错误,它必须是public abstract class AbstractE<T, E extends Enum<E> & AbstractE.Flags>。询问此类复杂问题时,请使用复制/粘贴 :)