泛型的理解和用法

//看了别人写的,结合自己的理解加了和减了一点东西

泛型:

1.为何有泛型?

首先,泛型是在编译期间进行校验的以保证类型安全。

第二就是,集合不会保证对象的类型,统一用父类object类型来指代,由于java的特性,在编译期间,父类和子类都可以用父类来指代,虽然运行时都是自己的实际类型,集合这个是这样的,他们用object这个统一的父类来指代,但是在编译期间你要使用子类特有的方法时的话还是要转换成子类类型,现在问题来了,集合类里面什么元素几乎都可以添加,毕竟都是object的子类,但是我们要使用的话,就会出现问题了,我们不知道到底是不是我们要使用的子类,万一集合里面添加了一个不是我们要用的子类,我们转换使用的时候就会报错:java.lang.ClassCastException

2.最简单的泛型实例

List<String> list = new ArrayList<String>();

就像这个加了String这个限制,放到集合里面的元素必须是String类型,取出数据的时候也没必要转换为string类型了,因为编译器已经知道了,不需要转换了(额外说下这个多态,多态的原理也正是这个原理,父类可以在编译期间指代子类,但是实际运行还是本身的类型,要是想用子类特有的方法,父类是不行的,虽然确实可以使用,但是编译时不会通过的,会报错,说找不到这个方法。)

3.自定义泛型接口、泛型类和泛型方法

class Box<T> {

private T data;

public Box() {

}

public Box(T data) {

this.data = data;

}

public T getData() {

return data;

}

}

public class DemoTest {

public static void main(String[] args) {

Box<String> name = new Box<String>("dh");

Box<Integer> age = new Box<Integer>(123);

System.out.println("name class:" + name.getClass());      // com.dh.Box

System.out.println("age class:" + age.getClass());        // com.dh.Box

System.out.println(name.getClass() == age.getClass());    // true

}

}

发现在泛型接口泛型类中我们一般使用E,K,V等常数来接收来自外部的类型实参,而且大家发现这个类型是一样的,终究发现泛型只是编译期的东西,不会带到运行期,主要就是校验所传信息是否正确罢了,当然在逻辑上我们可以理解这是一些不同类,但是实际上这些都是相同的类,就是我们在生成对象的时候,给这个对象传了一个类型参数过去,就是这个类型参数是这个类的一点限制,多了一个参数,一个校验参数罢了

4.类型通配符

public class DemoTest {

public static void main(String[] args) {

Box<String> name = new Box<String>("dh");

Box<Integer> age = new Box<Integer>(123);

Box<Number> number = new Box<Number>(456);

getData(name);

getData(age);

getData(number);

getUpperNumberData(name); // 1

getUpperNumberData(age);    // 2

getUpperNumberData(number); // 3

}

public static void getData(Box<?> data) {

System.out.println("data :" + data.getData());

}

public static void getUpperNumberData(Box<? extends Number> data){

System.out.println("data :" + data.getData());

}

}

我们用?来代替具体的类型实参,?可以说是所有的泛型类型的父类,可以指代任何泛型类型。是实参,不是形参。

<? extends T>必须是T和T的子类

<? Super T>必须是T或T的父类

时间: 2024-10-26 20:23:16

泛型的理解和用法的相关文章

泛型的理解

泛型:一直对这个概念都觉着迷糊,经过最近的阅读,自己有了一定的理解,现分享给大家.从字面的意思理解来看,泛型,泛就是模糊.暂不确定暂定的意思.本人这样理解为,使用泛型就是,定义的一个类型,类型暂不确定,给使用给一个占位符给代替,在使用的时候可以给确定其定义的类型.下面附上eg: public static PageList<T> ToPageList<T>(this IQueryable<T> source, int page, int size) { if (page

对java泛型的理解

自jdk1.6之后泛型就被广泛使用了,刚开始也是这么稀里糊涂的学了但是老是搞不懂其中的奥妙,后来随着项目经验的增多慢慢的才体会到了泛型的各种好处,看了不少项目封装的底层才发现原来泛型一般和接口混合使用来满足标准制定和参数多样化这样的代码需求.弄清楚之后我自己也动手实际体验了一下,觉得还是挺简单的.接下来就分享下我学泛型的心得,写的不好大家可以指出来. 1 标识接口 虽然叫标识接口但是这个java类不仅仅局限于interface,class也是OK的,选择接口还是类关键看自己的选择:下面是我定义的

C#泛型集合List&lt;T&gt;用法总结

List<T>在C#应用程序中是一种快捷.易于使用的泛型集合类型,使用泛型编程为编写面向对象程序增加了极大的效率和灵活性,不会强行对值类型进行装箱和拆箱,或对引用类型进行向下强制类型转换. 补充说明: 在决定使用IList<T> 还是使用ArrayList类(两者具有类似的功能)时,记住IList<T> 类在大多数情况下执行得更好并且是类型安全的. 如果对IList<T> 类的类型 T 使用引用类型,则两个类的行为是完全相同的.但是,如果对类型 T 使用值类

Java中泛型的理解

Java中的泛型,本质上来说,就是是参数化类型,就是说所操作的数据类型被指定为一个参数,而不是确定的某种类型.这种数据类型可以用在类.接口和方法创建中.即泛型类.泛型接口.泛型方法.这样说可能不够生动,来举些例子说明一下. 例子一 我们通过 例子一 来简单看看泛型的应用场景.下面的情况中,没有使用泛型: public class FanXingTest { public static void main(String[] args) { ArrayList arrayList = new Arr

C#基础:泛型的理解和使用

日常生活中的事物都是有类型的,比如我们说“一个女人”,那么“女”就是这个人的类型.我们可以说“女人都是水做的”,那么听者都知道这是在说“女”这种类型的人.再比如你去肉店买肉,你可以对老板说“我要十斤猪肉”,那么老板一定知道你是在要“猪”这种类型的肉. 日常生活中的这些语言都是带有类型的,但是在日常生活中还有一些语言是不带类型的.比如我们经常说“人是贪婪的”,这里的人就没有类型之分,听者都知道是指所有的人;我们也可以在肉店里指着猪肉说“给我来十斤肉”,肉店老板同样知道你要的是猪肉. 程序语言必须能

C#三十二 泛型的理解和使用

日常生活中的事物都是有类型的,比如我们说"一个女人",那么"女"就是这个人的类型.我们可以说"女人都是水做的",那么听者都知道这是在说"女"这种类型的人.再比如你去肉店买肉,你可以对老板说"我要十斤猪肉",那么老板一定知道你是在要"猪"这种类型的肉.日常生活中的这些语言都是带有类型的,但是在日常生活中还有一些语言是不带类型的.比如我们经常说"人是贪婪的",这里的人就没

java泛型的理解

最近在看视频,看到比较经典的比大小问题.输入两个数,返回大的数,类型可以为int,long,float等. 通常的教程中用这个例子引入了构造函数以及重载的概念,在学习完泛型后,我想到能不能写一个泛型的方法,用以实现比较. 为了完成这个任务,我们首先需要了解一下泛型. 什么的泛型 泛型是java语言系统的一种扩展,支持创建可以按照类型进行参数化的类. 泛型的好处 泛型的好处也是显而易见的, 首先可以扩充代码的通用性,通过泛型可以使方法支持更多的类型. 泛型有助于增强类型安全,编译器可以对类型进行比

关于Java泛型深入理解小总结

1.何为泛型 首先泛型的本质便是类型参数化,通俗的说就是用一个变量来表示类型,这个类型可以是String,Integer等等不确定,表明可接受的类型,原理类似如下代码 int pattern; //声明一个变量未赋值,pattern可以看作是泛型 pattern = 4; pattern = 5;//4和5就可以看作是String和Integer 泛型的具体形式见泛型类.泛型方法 *泛型类形式如下 class Test<T> { private T t; Test(T t) { this.t

Java:泛型的理解

本文源自参考<Think in Java>,多篇博文以及阅读源码的总结 前言 Java中的泛型每各人都在使用,但是它底层的实现方法是什么呢,为何要这样实现,这样实现的优缺点有哪些,怎么解决泛型带来的问题.带着好奇,我查阅资料进行了初步的学习,在此与诸位探讨. 一 类型参数 学过JAVA的人都知道泛型,明白大概怎么使用.在类上为:class 类名 {},在方法上为:public void 方法名 (T x){}.泛型的实现使得类型变成了参数可以传入,使得类功能多样化. 具体可分为5种情况: T是