Java 尝试使用泛型时出现问题

Java 尝试使用泛型时出现问题,java,generics,Java,Generics,我有一节课 public abstract class AbstractE<T, E extends Enum<E> & Flags> { public interface Flags{} /*marker interface*/ //... //other code } 我在主程序的最后一行(Set s=adapter.getFlags();)中得到以下编译时错误 E的推断类型无效;推断的类型不符合声明的绑定 推断:abstra

我有一节课

public abstract class AbstractE<T, E extends Enum<E> & Flags>
{
     public interface Flags{} /*marker interface*/
     //... 
     //other code
}
我在主程序的最后一行(Set s=adapter.getFlags();)中得到以下编译时错误

E的推断类型无效;推断的类型不符合声明的绑定

推断:abstract.Flags
绑定:java.lang.Enum、abstract.Flags
我做错了什么? 我正在使用Java6

编辑以指定错误位置

请尝试以下操作:

public interface IXYZAdapter <E extends Enum<E> & AbstractE.Flags>
{
   public Set<E> getFlags();
}

调用:
Set使用thomas提供的第一个解决方案,可以这样编写main方法,使其成为无警告的,而实际上不必知道枚举类型:

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());
    }
}
publicstaticvoidmain(字符串[]args){
M=新的M();
IXYZAdapter=(IXYZAdapter)m;
Set flags=adapter.getFlags();
Iterator it=flags.Iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}

哪一行触发了编译器错误?当我尝试编译时,行集合s=adapter.getFlags()-生成错误what is
return new EnumSet.allOf(EF.class)
应该是什么意思/做什么?我在EnumSet之前删除了“new”关键字。如果它是错误地键入的,那么您的第一行
公共抽象类AbstractE
给了我编译器错误,它必须是
公共抽象类AbstractE
。当问这种复杂的问题时,请使用复制/粘贴:)这两种解决方案都要求程序员在调用getFlags时知道枚举类型,否则至少会有警告。实际上,这不是真的。这取决于你如何写main方法:)我给你举个例子!您不会收到警告,但仍然必须将集合的元素强制转换为
abstract.Flags
。如果是那样的话,我会把签名改成
set,你能详细说明一下吗?这段代码运行得很好,我用这种方式打印了枚举的名称。听起来好像你暗示上面的代码不应该工作。我遗漏了什么吗?不,上面的代码是有效的。但是试试这个:
abstract.Flags f=it.next()。在本例中,您必须这样做:
abstract.Flags f=(abstract.Flags)it.next()
IXYZAdapter adapter = (IXYZAdapter)m; //where m is an instance of AbstractE
Set s = adapter.getFlags();
inferred: AbstractE.Flags

bound(s): java.lang.Enum<AbstractE.Flags>,AbstractE.Flags
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();
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);}

}
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());
    }
}