我有一个班级
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
已编辑以指定错误位置
答案 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());
}
}