GenericDemo2 泛型类的使用

/**

*    泛型的前世今生(泛型类的使用)

*    【学习结果】

    1,了解泛型类,泛型方法,泛型接口的定义体现形式。

    2,自定义泛型类,体会泛型前和泛型后的区别★★★★★

【目标:自定义泛型】

1,没有泛型之前,对于不确定的对象类型,是通过Object类型多态方式解决的。

         弊端:当对象提升为Object后,需要向下转型才可以使用对象的内容。

         而转型就会有运行发生ClassCastException异常的风险。

   2,有了泛型后,将不确定的类型定义成参数,把Object替换成参数类型。

        好处是:1.调用者在使用时必须先明确类型,如果操作的对象类型不符符合,直接编译失败。

  2.类型符合,使用对象特有方法时,不需要进行强制转换。

3,泛型类,泛型方法,泛型接口的体现。

4,注意:

4.1 类上的泛型是在创建该类对象时进行类型明确。

4.2 静态方法无法访问类上定义的泛型,如果需要泛型,只能定义在方法上。

*/

public class GenericDemo2 {

public static void main(String[] args) {

//part2:

//        ObjTool tool = new ObjTool();

//        tool.setObj("hehe");

//        String str = tool.getObj();    //编译出错,原因在于传参时存的是Obj类型,向上造型.

//        String str = (String) tool.getObj();

//        System.out.println(str);

//用户传入数字6

//        tool.setObj(6);    //编译没问题,因为6也造型为Object,语法上没问题.

//        String six = (String) tool.getObj();    //我们用同样的方法取数值发现

//java.lang.ClassCastException: 类型转换异常

/*JDK1.5之前,就是用Object这样的办法,来扩展类型

*但是在需要特有功能时,需要强转,麻烦.另外还有可能引发运行异常*/

//part3:

ObjTool<String> tool = new ObjTool<String>();

tool.setObj("haha");

String str = tool.getObj();    //1.无需强转了

//        tool.setObj(6);    //2.编译失败.类型不匹配,编译就报错,避免了运行时的类型异常.

}

}

/**part4: 将曾经的模拟队列数据结构加上泛型

*    定义自制队列数据结构

*    模拟用  遵循先进后出

*/

class MyQueue<Q> {

/*封装一个链表数据结构*/

private LinkedList<Q> queue;

/*注意:初始化MyStack

* new一个链表数据结构的列表*/

public MyQueue(){

queue = new LinkedList<Q>();

}

//模拟queue添加元素的方法(栈添加的是尾部的元素,也就是先进入的元素放在尾部)

public void add(Q obj){

queue.addFirst(obj);

//注意:存入的元素顺序,每一个在下一个的前面位置存放.

}

//模拟queue获取元素的方法(栈获取的是尾部的元素,也就是先入的元素)

public Object get(){

return queue.removeLast();

//注意1.因为是模拟队列,不能用LinkedList的get方法,那样不会移除头部的元素.

//     2.移除的是每次尾部的元素.根据上面add方法所述,即最先进入的元素在尾部,所以会先移除.

//     这样才符合栈的数据结构特点: 先进先出. 或者说后进后出.

}

//判断stack是否为空

public boolean isEmpty(){

return queue.isEmpty();

}

}

/**

*    part1:

*    定义一个工具,对对象进行操作,比如设置和获取

*    注意:现在的Tool只能操作String,如果现在还需要操作Integer类型的获取和设置.

*    那么需要在建立一个类,定义成Tool2 get ,setInteger方法,显然很麻烦.

*     那么就需要把String和Integer的共性部分向上抽取,即共性类型Object类型.

*    所以可以写成如下ObjTool.  看part2:

*    part3: jdk1.5有了新技术,泛型,改成如下这样。

*    类中操作的对象确定不?不确定,用Object,需要转型,运行容易出异常。不爽。

*    在定义时,就将不确定的对象的类型,定义成参数。由使用该类的调用者来传递对象类型。

*/

class ObjTool <T>{    //将泛型定义在类上,叫做泛型类

private T obj;

public T getObj() {

return obj;

}

public void setObj(T obj) {

this.obj = obj;

}

}

/*class ObjTool {    //实验完毕注释掉 part2

private Object obj;

public Object getObj() {

return obj;

}

public void setObj(Object obj) {

this.obj = obj;

}

}*/

/*class Tool {    //实验完毕注释掉

private String str;

*//**

* 获取str

* @return

*//*

public String getStr() {

return str;

}

*//**

* 设置str

* @param str

*//*

public void setStr(String str) {

this.str = str;

}

}*/

时间: 2024-07-30 20:47:25

GenericDemo2 泛型类的使用的相关文章

泛型简介,泛型类及使用

如果我们需要产生多个对象,每个对象的逻辑完全一样,只是对象内的成员变量的类型不同.那么我们该如何去做? ①   创建多个类文件,给每个类中的成员变量设置指定的数据类型; 1 public class Demo1{ 2 public static void main(String []args){ 3 MyClass1 myclass1=new MyClass1("张三"); 4 System.out.println(myclass1.getData()); 5 MyClass2 myc

泛型类定义和泛型方法以及泛型限定

1.泛型类定义的泛型,在整个类中有效.如果被方法使用,那么泛型类的对象明确要操作的具体类型后,所有要操作的类型就已经固定了. 2.为了让不同方法可以操作不同类型,而且类型还不确定.那么可以将泛型定义在方法上. 3.特殊之处: 静态方法不可以访问类上定义的泛型. 如果静态方法操作的应用数据类型不确定,可以将泛型定义在方法上. package tan; //定义泛型类(要操作的类型不确定) class Demo<T>{ public void show(T t){ System.out.print

Java泛型类泛型方法

使用泛型,在某些情况下可以有效减少代码量. Pair泛型类可以根据传入的参数类型进行相应的构造. minmax是泛型方法,不同数据类型的数组,也可以得到他们的min max值,需要注意的是传进去的T[]类类型必须是实现了Comparable方法的,否则无法调用compareTo()方法. 另外,泛型的类型必须是类类型,int, double, float这种是不行的,必须是Integer, Double, Float, String, StudentClass这种类类型的. /** 泛型类 *

19._7泛型继承之泛型类继承普通类

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _19._7泛型继承之泛型类继承普通类 { abstract class genClass<T> { protected T field; public virtual T property { get { return field; } } p

Java泛型学习笔记 - (二)泛型类

1. 我们先写一个没有泛型的类Box: 1 public class Box { 2 3 private Object obj; 4 5 public Box() {} 6 7 public Object getObj() { 8 return obj; 9 } 10 11 public void setObj(Object obj) { 12 this.obj = obj; 13 } 14 15 public Box(Object obj) { 16 super(); 17 this.obj

泛型类

1.类型是对象的模板,泛型不是类型,是类型的模板.c#提供五种泛型:类,结构,接口,委托和方法. 2.声明泛型类和普通类的区别 <1>在类名之后放置<> <2>在<>中用逗号分隔的占位符字字符串表示提供的类型-类型参数(type parameter) <3>在泛型类声明的主体中使用类型参数来表示应该被替代的类型 class Name<parameter1,paremeter2...> {public parameter1 demo=n

泛型类的标记扩展

原文出处:http://www.codeproject.com/Tips/871592/Markup-Extension-for-Generic-classes 标记扩展运行你再Xaml中声明泛型类. 简介: 我们经常要在Xaml中的style或DataTemplate或相似的地方使用泛型类. 然而.Net不允许在xaml中声明泛型.我们需要解决这个问题.本文提供的解决方案已经在很多案例中解决这个问题. 使用代码: 通过使用这里提供的新的扩展,你就能够在xaml中使用泛型. <DataTempl

泛型学习第二天——C#中的List&lt;string&gt;泛型类示例

在C#代码中使用一系列字符串(strings)并需要为其创建一个列表时,List<string>泛型类是一个用于存储一系列字符串(strings)的极其优秀的解决办法.下面一起有一些List<string>泛型类的示例,一起来看看吧. List示例 下面是一个使用C#创建一个新的一系列字符串的列表的示例,利用foreach语句循环使用其每一个字符串.请注意在代码片段的顶部添加所需的命名空间:“using System.Collections.Generic;”,List是该命名空间

Java泛型:泛型类、泛型接口和泛型方法

原文出自:https://segmentfault.com/a/1190000002646193 泛型类 public class Container<K, V> { private K key; private V value; public Container(K k, V v) { key = k; value = v; } public K getKey() { return key; } public void setKey(K key) { this.key = key; } pu