尝试使用泛型时出现问题 [英] Problem when trying to use generics

查看:112
本文介绍了尝试使用泛型时出现问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个类

  public abstract class AbstractE< T,E extends Enum< E> &安培;标志> 
{
public interface Flags {} / * marker interface * /
// ...
//其他代码
}
$ b $

和一个接口

  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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆