2010-03-05 41 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 */ 
}