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