c++的模板,就如同模板这个词字面上的意思一样,属于字符的替代过程 比如有一个模板函数 template <typename T> void foo(T t) { t.bar(); } 那么这个可以编译。不过你使用这个函数的时候,T必须是包含bar函数的类
java 则不行 static <T> void foo(T t) { t.bar(); } 这个是通不过编译的,因为编译器只知道T是一种Object,不知道T的具体类型。 你甚至不能写T t = new T(); 因为在这个方法定义的时候,编译器也不能保证T是有构造函数的
因为c++的模板做事方式是字符串的替代,所以模板参数是int等基本类型是完全没有问题的。 java则不允许int等基本类型作为泛型参数。比如ArrayList<int>是不可以的
java 有covariance 和 contravariance 也就是也可以写一个泛型方法,限定泛型参数是某一个具体的类的子类,比如 static <T> void foo(List<T extends Object> list) 这将能够接受List<String>作为参数,如果只写List<Object>,那是不能将List<String>作为参数传给他的 c++没有这种机制
|