Java泛型:方法不适用于参数(T)

时间:2016-01-20 05:59:30

标签: java generics

有很多类似错误的问题,但似乎没有一个问题能解决我的问题。

我只是希望能够使用各种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)编译错误。

2 个答案:

答案 0 :(得分: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"));
    }
}

答案 1 :(得分:1)

问题是T的类型为Object,因此您可以将每个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;
}