Java Generics vs输入函数

时间:2016-02-13 00:30:39

标签: java generics

我最近读了很多关于泛型的文章。

public static <T extends CharSequence> void prnt(T obj);

public static void prnt(CharSequence obj);

两者之间有什么区别吗?

2 个答案:

答案 0 :(得分:3)

对于你的例子,它并没有真正有所作为。

它产生影响的地方如下:

    public static CharSequence foo1(CharSequence c) {...}

    public static <T extends CharSequence> T foo2(T t) {...}

两者都将返回一个CharSequence子类型的对象,但第二个允许更多的灵活性。想象一下以下代码:

    String s = "test";
    CharSequence c = s;

    CharSequence c1 = foo1(c);
    CharSequence c2 = foo2(c);

这正如您所期望的那样正常。

    CharSequence c1 = foo1(s);
    String s2 = foo2(s);

在这里,我们看到为什么使用泛型声明函数是有意义的。使用<T extends CharSequence>,我们可以强制该函数仅适用于CharSequence的子类,而不会丢失有关实际类型的信息。另一方面,第一种方法会丢失这些信息,甚至可能会迫使你进行非常丑陋的演员表。

答案 1 :(得分:-1)

在你的情况下,他们是平等的, 他们都在实现CharSequence的工作。

在一般情况下,他们根本不相同!

例如,假设在第一种情况下返回T,在第二种情况下返回CharSequence,如下所示:

public static <T extends CharSequence> T prnt(T obj);

public static CharSequence prnt(CharSequence obj);

让我们同时使用CharBuffer(实现CharSequence)

public static CharBuffer prnt(CharBuffer obj);

public static CharSequence prnt(CharSequence obj);

如你所见,他们根本不相同。