尝试使用泛型时出现问题 [英] Problem when trying to use generics
问题描述
我有一个类
public abstract class AbstractE< T,E extends Enum< E> &安培;标志>
$ b $
{
public interface Flags {} / * marker interface * /
// ...
//其他代码
}
和一个接口
public interface IXYZAdapter
{
public< E extends Enum< E> &安培;标志>设置< E - 代替; getFlags();
}
其中Flags是AbstractE自身定义的接口。
由此扩展AbstractE:
public class M extends AbstractE< Long,M.EF>实现IXYZAdapter
{
public enum EF实现AbstractE.Flags {flag1,flag2}
@Override / *从IXYZAdapter * /
public Set< M.EF> getFlags()
{return EnumSet.allOf(EF.class);}
}
现在,从主代码中,我尝试获取接口IXYZAdapter的句柄并调用getFlags方法
IXYZAdapter adapter =(IXYZAdapter)m; //其中m是AbstractE
的一个实例Set s = adapter.getFlags();
主程序最后一行出现以下编译时错误(Set s = adapter.getFlags );)
E的无效推断类型;推断的类型不符合声明的边界(s)
推断: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>实现IXYZAdapter< M.EF>
{
}
或
设定< M.EF> s = adapter.getFlags();
问题是使用
Set s = adapter.getFlags();
系统不知道在IXYZAdapter中推断E的类型,因此AbstractE中的E不匹配。
编辑:
另一个选项可能是:
interface IXYZAdapter< E extends Enum< e基&安培; AbstractE.Flags>
{
public Set <?扩展E> getFlags();
}
class M extends AbstractE< Long,M.EF>实现IXYZAdapter< M.EF>
{
public enum EF实现了AbstractE.Flags {flag1,flag2}
public Set< ;?扩展M.EF> getFlags()
{return EnumSet.allOf(EF.class);}
}
然后调用:
Set <?扩展AbstractE.Flags> s = adapter.getFlags();
这将允许您在不投射的情况下获得一组标志,并强制将标志声明为枚举。
I have a class
public abstract class AbstractE<T, E extends Enum<E> & Flags> { public interface Flags{} /*marker interface*/ //... //other code }
and an interface
public interface IXYZAdapter { public <E extends Enum<E> & Flags> Set<E> getFlags(); }
Where Flags is an interface defined in AbstractE itself.
M extends AbstractE thus:
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);} }
Now, from the main code, I try to get a handle on the interface IXYZAdapter and invoke the getFlags method
IXYZAdapter adapter = (IXYZAdapter)m; //where m is an instance of AbstractE Set s = adapter.getFlags();
I get the following compile time error in the main program last line (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
What am I doing wrong? I am using Java 6
Edited to specify the error location
解决方案Try this:
public interface IXYZAdapter <E extends Enum<E> & AbstractE.Flags> { public Set<E> getFlags(); }
And
public class M extends AbstractE<Long, M.EF> implements IXYZAdapter<M.EF> { }
Or
Set<M.EF> s = adapter.getFlags();
The problem is that with
Set s = adapter.getFlags();
The system doesn't know which type to infer for E in IXYZAdapter and thus the E in AbstractE doesn't match.Edit:
Another option might be:
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);} }
And the call:
Set<? extends AbstractE.Flags> s = adapter.getFlags();
This would allow you to get a set of flags without casting and force the flags to be declared as enum.
这篇关于尝试使用泛型时出现问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文