2016-01-20 179 views
2

有很多类似错误的问题,但它们都不能解决我的问题。Java泛型:方法不适用于参数(T)

我只是想能够重复使用相同的foo通用与各种bar方法。什么是正确的方法来做到这一点?

public class Test { 

    static public <T> String foo(T object) { 
     return bar(object); 
    } 

    static public String bar(String object){ 
     return "string:" + object; 
    } 


    static public String bar(Integer object){ 
     return "integer:" + object; 
    } 


    public static void main(String[] args) throws Exception { 
     System.out.println(foo("blabla")); 
    } 
} 

我收到The method bar(String) in the type Test is not applicable for the arguments (T)编译错误。

+0

这没有任何意义。为什么不声明两个重载的'foo'函数呢? –

+0

当然,因为你没有传递'String',所以你会传递一个'不管怎么样'。而'bar()'并没有声明它可以采用'无论什么碰巧'。我想也许你想要参数化类,而不是单个方法?例如,[像这样](http://pastebin.com/WUA5wGA6)。 – aroth

+0

@SergeyTachenov那么你打算写两个相同的'foo两次吗?' – VitoshKa

回答

1

您应该更新如下。由于功能无法知道类型它激发了错误

public class Test { 

    static public <T> String foo(T object) { 
     if(object instanceof String){ 
      return bar((String)object); 
     }else if(object instanceof Integer){ 
      return bar((Integer)object); 
     } 
     return null; 
} 

    static public String bar(String object){ 
     return "string:" + object; 
    } 


    static public String bar(Integer object){ 
     return "integer:" + object; 
    } 


    public static void main(String[] args) throws Exception { 
     System.out.println(foo("blabla")); 
    } 
} 
+0

那么通用性有什么意义呢?不妨声明'foo(Object)'。事实上,这只会增加混乱。 –

1

的问题是,TObject类型,所以,你可能每一个Java对象传递给foo。另一方面,您的bar方法的参数具有指定类型,在本例中为StringInteger。你要做的是将Object传递给期望String的方法。由于Java不能自动向下播放类,所以会出现此错误。

你必须投T为正确的类型,像这样

public String foo(Object object) { 
    if(object instanceof String) 
     return bar((String)object); 
    if(object instanceof Integer) 
     return bar((Integer)object);  
    return null; 
} 
+1

再次,为什么它甚至是通用的?只需声明'foo(Object)'。 –

+0

你说得对。没有想到这一点。 – Kagemusha

相关问题