0

我创建了一个方法如下

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 返回它。无论如何,我在返回语句中收到错误说Type mismatch: cannot convert from String to N。我的问题是这个方法接受字符串值(即使类型是 N)没有任何问题,但为什么它在返回语句中给出错误?

4

6 回答 6

5

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

考虑一下,addTwoString(1,2)根据您的方法,这应该返回整数,但sb.toString()它是一个字符串。这就是为什么它是一个编译器错误。

于 2013-09-24T12:05:25.247 回答
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 而不是通用版本 也可以。

于 2013-09-24T12:18:47.577 回答
1

为什么在这里使用泛型?

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

    return sb.toString();
}

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

于 2013-09-24T12:06:38.773 回答
1

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

我知道您正在学习泛型,但您尝试做的事情告诉我您还没有理解基础知识。

通读这些——

Oracle 泛型

Java 泛型:List、List<Object>、List<?>

于 2013-09-24T12:08:23.797 回答
0

问题是您没有为N.

你来做这件事:

addTwoString("a", "b");

虽然你应该这样做:

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

备注1:我认为这里存在设计缺陷。您的方法说它正在与Strings 一起使用,因此您实际上并不需要N此处的类型参数。这是正确的方法:

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

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

于 2013-09-24T12:16:27.030 回答
0

如果您真的想使用 generic ,请将 typecast 转换return sb.toString();return (N)sb.toString();

但是,您的方法应该只是返回。不知道为什么你想要 Generic for String?

于 2013-09-24T12:09:09.063 回答