Java泛型是java中重点,有了泛型之后编译器会自动帮助转换,就能够使程序更加安全,但是要正确使用泛型才能取得事半功倍的效果。那java中的泛型怎么用?下面来我们就来给大家讲解一下。
1. 限制泛型可用类型
在 Java 中默认可以使用任何类型来实例化一个泛型类对象。当然也可以对泛型类实例的类型进行限制,语法格式如下:
class 类名称 < T extends anyClass >
例如,在下面的示例代码中创建了一个 ListClass 类,并对该类的类型限制为只能是实现 List 接口的类。
// 限制ListClass的泛型类型必须实现List接口 public class ListClass < T extends List > { public static void main(String[] args) { // 实例化使用ArrayList的泛型类ListClass,正确 ListClass < ArrayList > lc1 = new ListClass < ArrayList > (); // 实例化使用LinkedList的泛型类LlstClass,正确 ListClass < LinkedList > lc2 = new ListClass < LinkedList > (); // 实例化使用HashMap的泛型类ListClass,错误,因为HasMap没有实现List接口 // ListClass<HashMap> lc3=new ListClass<HashMap>(); } }
在上述代码中,定义 ListClass 类时设置泛型类型必须实现 List 接口。例如,ArrayList 和 LinkedList 都实现了 List 接口,所以可以实例化 ListClass 类。而 HashMap 没有实现 List 接口,所以在实例化 ListClass 类时会报错。
当没有使用 extends 关键字限制泛型类型时,其实是默认使用 Object 类作为泛型类型。因此,Object 类下的所有子类都可以实例化泛型类对象,如图所示的这两种情况。
2. 使用类型通配符
Java 中的泛型还支持使用类型通配符,它的作用是在创建一个泛型类对象时限制这个泛型类的类型必须实现或继承某个接口或类。
使用泛型类型通配符的语法格式如下:
泛型类名称 < ? extends List > a = null;
其中,“”作为一个整体表示类型未知,当需要使用泛型对象时,可以单独实例化。
例如,下面的示例代码演示了类型通配符的使用。
A < ? extends List > a = null; a = new A < ArrayList > (); // 正确 b = new A < LinkedList > (); // 正确 c = new A < HashMap > (); // 错误
3. 继承泛型类和实现泛型接口
定义为泛型的类和接口也可以被继承和实现。例如下面的示例代码演示了如何继承泛型类。
public class FatherClass < T1 > {} public class SonClass < T1, T2, T3 > extents FatherClass < T1 > {}
下面的示例代码演示了如何在泛型中实现接口。
interface interface1 < T1 > {} interface SubClass < T1, T2, T3 > implements Interface1 < T2 > {}
1、泛型的没有使用会造成什么后果呢?
import org.junit.Test; import java.util.ArrayList; /** * 泛型的使⽤ * 1.jdk5.0新增的特征 */ public class GenericTest { //在集合中使⽤泛型之前的情况: @Test public void test() { ArrayList list = new ArrayList(); //需求:存放学⽣的成绩 list.add(78); list.add(49); list.add(72); list.add(81); list.add(89); //问题⼀:类型不安全 // list.add("Tom"); for (Object score: list) { //问题⼆:强转时可能出现类型转化异常 int stuScore = (Integer) score; System.out.println(stuScore); } } }
那我们发现,没有添加泛型的时候呢,我们可以向list集合添加各种各样类型的数据,那么就会导致在数据类型转换的时候发生异常,那么我们添加泛型的好处也是很明显的了。
2.添加泛型的使用会发生什么效果呢?
public class GenericTest { //!在集合中使⽤泛型的情况:以ArrayList为例 @Test public void test2() { //注意点:泛型的类型必须是类,不能是基本数据类型。需要⽤到基本数据类型的位置,拿包装类替换 //看图例这⾥规定泛型是Integer,使⽤add⽅法的时候也是Integer ArrayListlist = new ArrayList(); list.add(78); list.add(49); list.add(72); list.add(81); list.add(89) //编译时,就会进⾏类型检查,保证数据的安全 // list.add("Tom"); //⽅式⼀: // for(Integer score :list){ // //避免了强转的操作 // int stuScore = score; // // System.out.println(stuScore); // } //⽅式⼆: Iteratoriterator = list.iterator(); while (iterator.hasNext()) { int stuScore = iterator.next(); System.out.println(stuScore); } } //在集合中使⽤泛型的情况:以HashMap为例 @Test public void test3() { // Mapmap = new HashMap(); //jdk7新特性:类型推断, 实例化的时候就可以不⽤写泛型,空即可 Mapmap = new HashMap < > (); map.put("Tom", 87); map.put("Tone", 81); map.put("Jack", 64); // map.put(123,"ABC"); //泛型的嵌套 Set < map.entry > entry = map.entrySet(); Iterator < map.entry > iterator = entry.iterator(); while (iterator.hasNext()) { Map.Entrye = iterator.next(); String key = e.getKey(); Integer value = e.getValue(); System.out.println(key + "----" + value); } } }
所以总的来说,使用泛型在很大程度上来提高了java的程序安全,提高了代码的重用性,并且还能使开发更加方便哦!最后大家如果想要了解更多java入门知识,敬请关注奇Q工具网。
推荐阅读: