泛型方法的问题

时间:2013-09-24 12:03:13

标签: java

我创建了一个方法,如下所示

static <N> N addTwoString(N a, N b){


        StringBuilder sb = new StringBuilder();
        sb.append(a);
        sb.append(b);

        return sb.toString();
    }

public static void main(String[] args)
    {


        addTwoString("a", "b");
    }

对于这种情况,我传递两个字符串并追加它并使用StringBuilder返回它。 无论如何,我在return语句中收到错误类型不匹配:无法从String转换为N 。 我的问题是这个方法接受字符串值(甚至类型是N)没有任何问题,但为什么它在return语句中给出错误?

6 个答案:

答案 0 :(得分:5)

sb.toString()将始终返回一个字符串,另一方面,您的方法应返回N类型。

根据您的方法考虑addTwoString(1,2),这应该返回Integer,但sb.toString()是一个String。这就是编译错误的原因。

答案 1 :(得分:1)

为什么在这里使用泛型?

static String addTwoString(String a, String b){
    StringBuilder sb = new StringBuilder();
    sb.append(a);
    sb.append(b);

    return sb.toString();
}

除此之外,你为什么还需要这种方法呢?相反,您可以使用a.concat(b)a + b

答案 2 :(得分:1)

N不是字符串。但是,您尝试将字符串作为N传递,并且您还返回一个字符串但返回类型为N.

我知道你正在学习泛型,但是你想要做的事情告诉我你还没有理解基础知识。

通读这些 -

Oracle Generics

Java Generics: List, List<Object>, List<?>

答案 3 :(得分:1)

class Test
{
    public static void main(String[] args)
    {
        addTwoString("a", "b");
    }
    static <N> String addTwoString(N a, N b){
        StringBuilder sb = new StringBuilder();
        sb.append(a);
        sb.append(b);

        return sb.toString();
    }
}

如果您确定该函数只返回String类型并且转换为返回(N)sb.toString();返回类型应该是String而不是泛型版本。也会有效。

答案 4 :(得分:0)

如果您确实想使用泛型,请将类型转换return sb.toString();转换为return (N)sb.toString();

但是你的方法应该返回。不确定为什么你想要Generic for String?

答案 5 :(得分:0)

问题是您没有为N传递类型参数。

你这样做:

addTwoString("a", "b");

虽然你应该这样做:

MyClass.<String>addTwoString("a", "b");

备注1 :我认为这里存在设计缺陷。您的方法表示它正在使用String s,因此您不需要N类型参数。这是正确的方法:

static String addTwoStrings(String a, String b){
        StringBuilder sb = new StringBuilder();
        sb.append(a);
        sb.append(b);
        return sb.toString();
}

备注2 :我认为你不应该在这里重新发明轮子。如果这不是家庭作业,你最好使用内置方法添加两个字符串(concat(String)