我最近读了很多关于泛型的文章。
public static <T extends CharSequence> void prnt(T obj);
public static void prnt(CharSequence obj);
两者之间有什么区别吗?
答案 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);
如你所见,他们根本不相同。