Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java泛型与函数类型_Java_Generics - Fatal编程技术网

Java泛型与函数类型

Java泛型与函数类型,java,generics,Java,Generics,最近我读了很多关于泛型的书 public static <T extends CharSequence> void prnt(T obj); public static void prnt(CharSequence obj); publicstaticvoidprnt(T obj); 公共静态无效prnt(CharSequence obj); 两者之间有什么区别吗?对于你的例子来说,这并没有什么区别 下面是一个不同的例子: public static CharSeque

最近我读了很多关于泛型的书

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

public static void prnt(CharSequence obj);
publicstaticvoidprnt(T obj);
公共静态无效prnt(CharSequence obj);

两者之间有什么区别吗?

对于你的例子来说,这并没有什么区别

下面是一个不同的例子:

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

    public static <T extends CharSequence> T foo2(T t) {...}
正如您所期望的那样,它工作得很好

    CharSequence c1 = foo1(s);
    String s2 = foo2(s);
这里我们看到了为什么使用泛型声明函数是有意义的。使用
我们可以强制执行该函数仅与
CharSequence
的子类一起工作,而不会丢失有关实际类型的信息。另一方面,第一种方法将丢失这些信息,甚至可能迫使你进行一次非常丑陋的施法。

在你的情况下,他们是平等的, 他们都致力于实现CharSequence的东西

在一般情况下,他们根本不平等

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

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

public static CharSequence prnt(CharSequence obj);

正如你所看到的,他们根本不平等

如果您编写这两个方法,编译它们,然后使用javap查看字节码,您可以自己查看。
public static <T extends CharSequence> T prnt(T obj);

public static CharSequence prnt(CharSequence obj);
public static CharBuffer prnt(CharBuffer obj);

public static CharSequence prnt(CharSequence obj);