当前位置:首页 > 开发 > 编程语言 > Java > 正文

【Java范型二】Java范型详解之extend限定范型参数的类型

发表于: 2014-08-30   作者:bit1129   来源:转载   浏览:
摘要: 在第一篇中,定义范型类时,使用如下的方式:   public class Generics<M, S, N> { //M,S,N是范型参数 }  这种方式定义的范型类有两个基本的问题:   1. 范型参数定义的实例字段,如private M m = null;由于M的类型在运行时才能确定,那么我们在类的方法中,无法使用m,这跟定义pri

在第一篇中,定义范型类时,使用如下的方式:

 

public class Generics<M, S, N> {
   //M,S,N是范型参数
}

 这种方式定义的范型类有两个基本的问题:

 

1. 范型参数定义的实例字段,如private M m = null;由于M的类型在运行时才能确定,那么我们在类的方法中,无法使用m,这跟定义private Object m = null没有什么分别

 

2. 在上面的类型定义中,M,S,N太随意,如果是自己定义范型类自己使用,那么可以保证为M,S,N传入这个范型类型需要的实际类型,但是当这个范型类作为框架的一部分或者API给其它人用,那么我们需要限定M,S,N的类型,以便于在范型类中做具体的事情

 

 基于此,Java提供了在定义范型类时限定类型参数的类型的方式

 

 举例:

package com.tom.lang.generics;

import java.util.List;

//例子不恰当,只是说明extends在范型中的含义
public class List2ToStringUtil<T extends List> {//T实现了List接口或者继承自List接口
    private T list;  //list是List类型的,可以作为list使用

    public List2ToStringUtil(T list) {
        this.list = list;
    }

    public String getString() {
        StringBuilder sb = new StringBuilder();
        System.out.println(list.getClass().getName());
        for (int i = 0; i < list.size(); i++) {
            sb.append(list.get(i).toString()).append(",");
        }
        return sb.toString();
    }
}

    //使用
    @Test
    public void testExtend() {
        List<String> list = new ArrayList<String>();
        list.add("A");
        list.add("B");
        List2ToStringUtil<List> collection = new List2ToStringUtil<List>(list);
        String str = collection.getString();
        System.out.println(str);

        Set<String> set = new HashSet<String>();
        set.add("A");
        set.add("B");
        List2ToStringUtil<List> collection = new List2ToStringUtil<Set>(set); //Set作为范型参数不正确
        List2ToStringUtil<List> collection = new List2ToStringUtil<List>(set); //set集合作为构造参数不正确,类型不匹配
    }

 

上面的例子不怎么恰当,只是演示了extend的用法,List2StringUtil是范型类,它能接受的范型必须是继承自java.util.List的集合;然后在类中,可以像使用List list一样使用T list。

 

总结

1. 使用 <T extends SuperClass>之后,类型参数就必须是继承自SuperClass

2. 在类的定义中,T不再是要等到运行时才能确定的类型,它在编译时就可以确定它是SuperClass或者SuperClass的子类型,不论哪种情况,都可以当做SuperClass来用,可以调用SuperClass提供的方法

 

类型参数的默认限制

不使用extends关键字声明范型类,实际上是extends Object,比如

 

public class Generics<M, S, N> {
   //M,S,N是范型参数
}

实际上是

public class Generics<M extends Object, S extends Object, N extends Object> {
   //M,S,N是范型参数
}

 

 

 

 

 

 

 

 

 

 

 

 

 

【Java范型二】Java范型详解之extend限定范型参数的类型

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
原文地址:http://blog.csdn.net/m13666368773/article/details/7951223 Java的泛型在代码中引用时
用C语言来实现堆栈的范型,体验C语言的真正魅力。相比C++里的范型,用C语言实现感觉更真切,更踏实
偶然间,发现IronPython 1.0支持.Net的范型类,可以讲太强大了。哈! 用以下代码可以测试出来: fro
本文例子下载 http://files.cnblogs.com/foundation/GenericActivitySample.rar 范型Activity Activ
说明:在List<T>范型集合中提供了一类委托,以确定要寻找集合中的哪些符合条件的单个元素或者
任何一个想在程序开发这条路上走远点的人都应当多了解几门语言,多接触一些编程泛型,才能打开眼界
  现在我们所做的很大一部分工作其实就是CRUD, 我们的aspx.cs页面充斥着大量的CRUD逻辑.当需要
说明:在List<T>范型集合中提供了一类委托,以确定要寻找集合中的哪些符合条件的单个元素或者
七周七语言:理解多种编程范型 编辑推荐   2011年Jolt大奖图书   带你轻松入门七种先锋语言  
  我认为,图书的封面很重要,因为首先映入读者眼帘的就是封面,他可以诱发潜在的读者去注意图书,
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号