数据结构泛型

Posted 奔向sj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构泛型相关的知识,希望对你有一定的参考价值。

1.定义

先让我们看看官方是如何定义泛型的

是不是看起来不太容易,解释一下:

就是我们想有一种数据类型,它可以适用各种数据类型。从代码上讲就是对类型实现参数化。

2.引例

例:实现一个类,类中包含一个数组成员,使得数组中可以存放任何类型的数据,也可以根据成员方法返回数组中某个下标的值。

思路

我们见过整形数组:int[ ] arr1 = 1,2,3; 字符型数组String[ ] arr2 = a,b,c

现在我们想有一个这样的数组1 , 2 , a , b , 3.432 整型、字符型、浮点型等等都有

我们知道 Object 是任何类的父类

所以我们这样写:

 public Object[] array = new Object[10];

那么我们就可以对这个数组进行如下操作

class MyArray
    public Object[] array = new Object[10];
    public Object getPos(int pos) //获取pos下标的值
        return array[pos];
    
    public void setPos(int pos,Object val) //给pos下标放一个元素
        array[pos] = val;
    

于是我们调用这两个方法

但是我们并不能获取下标为1的元素,因为Array里面的数据类型是Object,而ret是字符串。

Object是String的父类,这是向下转型,所以会报错。

我们要强制类型转换才不会报错

String ret = (String) myArray.getPos(1);

 但是我们希望:

1.我们能不能自己指定类型

2.我们能不能不再进行强制类型转换

于是出现了泛型可以满足我们的要求。

3.语法

<T>:占位符—>代表当前类是一个泛型类

1.<Integer>指定当前类中,使用的类型是Integer类型,即指定这个数组是Integer类型的
2.泛型在编译期间做了两件事:
      2.1 存放元素的时候,进行了类型的检查
      2.2 取元素的时候,进行了类

3.<>里面是引用类型

class MyArray<T> //定义一个泛型类
    //public Object array[] = new Object[10];
    //public T[] array = new Object[10]; 报错
    public T[] array = (T[]) new Object[10];
    public T getPos(int pos) //获取pos下标的值
        return array[pos];
    
    public void setPos(int pos,T val) //给pos下标放一个元素
        array[pos] = val;
    

public class TestDemo 
    public static void main(String[] args) 
       
        MyArray<Integer> myArray = new MyArray<Integer>();//也可以写成new MyArray<>()
        myArray.setPos(0,1);
        Integer ret = myArray.getPos(0);
        System.out.println(ret);

        MyArray<String> myArray1 = new MyArray<String>();
        myArray1.setPos(0,"abc");
        String ret1 = myArray1.getPos(0);
        System.out.println(ret1);
    

自定义泛型结构:泛型类泛型接口泛型方法

1. 泛型的声明
interface List<T> 和 class GenTest<K,V>
其中,T,K,V不代表值,而是表示类型。这里使用任意字母都可以。
常用T表示,是Type的缩写

2. 泛型的实例化:
一定要在类名后面指定类型参数的值(类型)。如:
List<String> strList = new ArrayList<String>();
Iterator<Customer> iterator = customers.iterator();
 T只能是类,不能用基本数据类型填充。但可以使用包装类填充
 把一 个 集合 中是 的内容限制为一个特定的数据类型,这就是generics 背后
的核心思想

 

 

 

自定义泛型结构:泛型类、泛型接口

 

 

 

 

 

 

 

 

 

应用场景举例:
【DAO.java】:定义了操作数据库中的表的通用操作。 ORM思想(数据库中的表和Java中的类对应)
public class DAO<T> {//表的共性操作的DAO

//添加一条记录
public void add(T t){

}

//删除一条记录
public boolean remove(int index){

return false;
}

//修改一条记录
public void update(int index,T t){

}

//查询一条记录
public T getIndex(int index){

return null;
}

//查询多条记录
public List<T> getForList(int index){

return null;
}

//泛型方法
//举例:获取表中一共有多少条记录?获取最大的员工入职时间?
public <E> E getValue(){

return null;
}

}

【CustomerDAO.java】:
public class CustomerDAO extends DAO<Customer>{//只能操作某一个表的DAO
}

【StudentDAO.java】:
public class StudentDAO extends DAO<Student> {//只能操作某一个表的DAO
}

 

以上是关于数据结构泛型的主要内容,如果未能解决你的问题,请参考以下文章

使用泛型类型执行 EntityFramework Core LINQ 查询

泛型 Field 和 SetField 方法 (LINQ to DataSet)

C#→关于System.Data.Linq下的Table<TEntity> 泛型类 的问题

C#委托之泛型

泛型类继承和 LINQ 扩展方法

泛型类型上的 Linq 类型转换