2010-03-05 39 views
2

这似乎并不工作(编译抱怨SomethinggetFoo()方法没有实现HasFoo),我想不通为什么或如何解决它....的java:界面和模板

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 */ 
} 

我想输入接口,我也希望能够做的东西像

Something something = ... 
Blob blob1 = something.getFoo(FooKey.BLOB1); 
Donut donut = something.getFoo(FooKey.DONUT); 

回答

1

不这项工作?

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

doh!所以它!我不知道你可以在界面中做到这一点,我认为你只能做'接口HasFoo '。 – 2010-03-05 15:36:46

0

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

<T> T getFoo(FooKey k) 

Object getFoo(FooKey k) 

Althought对象是最终的祖先编译器要签名是完全一样

0

你的界面指定对象,而impl的返回类型是'任何'。您需要更改界面返回T.

顺便说一句,你也可以声明你的地图是< FooKey,T>

+0

无法声明地图为。 T对于班级来说并不是一成不变的。这是一张不同事物的地图。 – 2010-03-05 16:23:37

+0

是的,你可以。你从方法中返回T ......是从地图来的,不是? – 2010-03-06 00:37:20

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 */ 
}