![](/img/trans.png)
[英]Weird compile-time behavior when trying to use primitive type in generics
[英]Problem when trying to use 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
编辑以指定错误位置
尝试这个:
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();
Set<? extends AbstractE.Flags> s = adapter.getFlags();
这将允许您在不进行强制转换的情况下获取一组标志,并强制将标志声明为枚举。
使用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());
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.