我有课
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/