java:接口和模板

时间:2010-03-05 14:59:49

标签: java generics casting

这似乎不起作用(编译器抱怨Something的{​​{1}}方法没有实现getFoo()),我无法弄清楚为什么或如何解决它....

HasFoo

我想要一个界面,我也希望能够做像

这样的事情
enum FooKey { BLOB1, DONUT, ... }

interface HasFoo
{
   public Object getFoo(FooKey k);
}

class Something implements HasFoo
{
    private Map<FooKey, Object> map;

    @SuppressWarnings("unchecked")
    @Override
    <T> T getFoo(FooKey k)
    {
        return (T)map.get(k);
    }

    /* other stuff deleted */
}

4 个答案:

答案 0 :(得分:1)

这不行吗?

interface HasFoo
{
   public <T> T getFoo(FooKey k);
}

答案 1 :(得分:1)

您不能使用通用方法覆盖非泛型方法。另一种选择可能是:

interface HasFoo
{
    <T> T getFoo(FooKey k);
}

class Something implements HasFoo
{
    private Map<FooKey, Object> map;

    @Override
    public <T> T getFoo(FooKey k)
    {
        return (T)map.get(k);
    }

    /* other stuff deleted */
}

答案 2 :(得分:0)

编译器的错误确实意味着方法的签名不同:

<T> T getFoo(FooKey k)

Object getFoo(FooKey k)

Althought Object是最终的祖先编译器,希望签名完全相同

答案 3 :(得分:0)

您的界面正在指定一个Object,而impl的返回类型是“任何”。您需要更改界面以返回T.

顺便说一下,你也可以声明你的地图是&lt; FooKey,T&gt;