java中的泛型提供了在编译时期的类型检查,这让java语言更具健壮.
在泛型没有出来之前,也就是JDK1.5之前,往往使用的是Object这个根类来进行接口的声明.然后进行具体的类型转化.
更多的形式如下:
foo.setFoo(new Integer(5));
Integer i =(Integer)foo.getFoo();
而泛型的出现则省去了这一环节.典型的就是以一个参数如T 进行类型的申明.在实例与具体操作时进行类型的指定.如Foo<T>
当我们申明了:
Foo<Integer> foo1 = null;
Foo<Boolean> foo2 = null;
时,就不能
foo1 = new Foo<String>("");
foo2 = new Foo<String>("");
也就是foo1,foo2只能代表Integer和Boolean的Foo,因为我们已经知道了它的具体所属类型.
如果我们不知道它具体为何类型可以申明为
Foo<?> foo = null
这样我们就可以对foo任意实例了:
foo = new Foo<String>("");
foo = new Foo<Integer>(5);//autoboxing
当然我们也可以对这个未知类型进行限定:
Foo<? extends List> foo;
这样foo就只有匹配List的子类了.
同样也可以时行向上限定
Foo<? super ArrayList> foo
在泛型没有出来之前,也就是JDK1.5之前,往往使用的是Object这个根类来进行接口的声明.然后进行具体的类型转化.
更多的形式如下:
foo.setFoo(new Integer(5));
Integer i =(Integer)foo.getFoo();
而泛型的出现则省去了这一环节.典型的就是以一个参数如T 进行类型的申明.在实例与具体操作时进行类型的指定.如Foo<T>
当我们申明了:
Foo<Integer> foo1 = null;
Foo<Boolean> foo2 = null;
时,就不能
foo1 = new Foo<String>("");
foo2 = new Foo<String>("");
也就是foo1,foo2只能代表Integer和Boolean的Foo,因为我们已经知道了它的具体所属类型.
如果我们不知道它具体为何类型可以申明为
Foo<?> foo = null
这样我们就可以对foo任意实例了:
foo = new Foo<String>("");
foo = new Foo<Integer>(5);//autoboxing
当然我们也可以对这个未知类型进行限定:
Foo<? extends List> foo;
这样foo就只有匹配List的子类了.
同样也可以时行向上限定
Foo<? super ArrayList> foo