1.1普通泛型
package test.lujianing; /** * 泛型类 * @param <t> */ class test<t>{ private t obj; public void setvalue(t obj){ this.obj =obj; } public t getvalue(){ system.out.println(obj.getclass().getname()); return obj; } } /** * 测试泛型类 */ public class testone { public static void main(string[] args) { //测试integer泛型 test<integer> t1 = new test<integer>(); t1.setvalue(5); integer i = t1.getvalue(); system.out.println(i); //测试double泛型 test<double> t2 = new test<double>(); t2.setvalue(5.55d); double d = t2.getvalue(); system.out.println(d); //测试string泛型 test<string> t3 = new test<string>(); t3.setvalue("hello world"); string str =t3.getvalue(); system.out.println(str); } }
输出结果:
java.lang.integer 5 java.lang.double 5.55 java.lang.string hello world
1.2 k/v泛型
package test.lujianing; import java.util.hashmap; import java.util.map; /** * created by administrator on 14-3-30. */ class testkv<k,v>{ private map<k,v> map=new hashmap<k, v>(); public void put(k k, v v) { map.put(k,v); } public v get(k k) { return map.get(k); } } public class testfour{ public static void main(string[] args) { testkv<string,string> t = new testkv<string, string>(); t.put("name","jianing"); system.out.println(t.get("name")); testkv<string,integer> t2 = new testkv<string, integer>(); t2.put("age",24); system.out.println(t2.get("age")); } }
输出结果:
jianing 24
2.泛型接口
package test.lujianing; /** * 泛型接口 * @param <t> */ public interface testimpl<t> { public void setvalue(t t); public t getvalue(); }
输出结果:
1 hello word
3.泛型方法
package test.lujianing; /** * 泛型方法类 */ class testmethod{ /** * 泛型方法 */ public <t>t getvalue(object s,class<t> clazz) { system.out.println(clazz.getname()); t t =null; if(clazz.getname().equals("java.lang.integer")){ double d = double.parsedouble(s.tostring()); int i =d.intvalue(); t=(t)new integer(i); } if(clazz.getname().equals("java.lang.double")){ t=(t)new double(s.tostring()); } return t; } } /** * 泛型方法测试类 */ public class testthree { public static void main(string[] args) { testmethod t = new testmethod(); int i =t.getvalue("30.0011",integer.class); system.out.println(i); double d =t.getvalue("40.0022",double.class); system.out.println(d); } }
输出结果:
java.lang.integer 30 java.lang.double 40.0022
4.限制泛型
在上面的例子中,没有限制class test<t>类型持有者t的范围,默认限定类型相当于object。比如我们要限制t为数字接口类型。只需要这么做:class test<t extends number>,这样类中的泛型t只能是number接口的实现类,传入非number接口编译会出错。
5.通配泛型
package test.lujianing; import java.util.hashmap; import java.util.map; /** * 通配泛型 */ public class testfive { public static void main(string[] args) { map<string,class<? extends number>> map = new hashmap<string,class<? extends number>>(); map.put("integer",integer.class); map.put("double",double.class); for (map.entry<string,class<? extends number>> entry : map.entryset()) { system.out.println("key:" + entry.getkey() + " value:" + entry.getvalue()); } } }
输出结果:
key:double value:class java.lang.double key:integer value:class java.lang.integer
简单的例子:针对1.1的例子
public static void main(string[] args) { //测试integer泛型 test<integer> t1 = new test<integer>(); t1.setvalue(5); fun(t1); //测试double泛型 test<double> t2 = new test<double>(); t2.setvalue(5.55d); fun(t2); } public static void fun(test<?> t){ system.out.println("通配泛型"+t.getvalue()); }
输出结果:
java.lang.integer 通配泛型5 java.lang.double 通配泛型5.55
6.补充
在泛型中,可能会遇到8742468051c85b06f0a0af9e3e506b5c1a4db2c2c2313771e5742b6debf617a1等,t和e分别是type和element的首字母。e一般用来表示集合类型中的元素的类型,例如list接口的定义,public interface list1a4db2c2c2313771e5742b6debf617a1 extends collection1a4db2c2c2313771e5742b6debf617a1。这只是一种命名习惯,两者没有本质区别。
更多多个java泛型示例分享。
