首页 > 其他分享 >9 泛型

9 泛型

时间:2022-12-13 23:25:13浏览次数:35  
标签:sort ArrayList list 类型 泛型 public

Head First Java 和 AcWing Java课程做的总结9。

9.1 引入

Java集合框架(Collection Framework)能够支持绝大多数会用到的数据结构。

比如ArrayList<String>,现在要对其排序,但ArrayList没有sort()这个方法。

ArrayList不是唯一的集合:

  • TreeSet
  • HashMap
  • LinkedList
  • HashSet
  • LinkedHashMap

要排序现在可以用TreeSet或者Collections.sort()方法。

现在是可以用添加一行代码来排序

import java.util.*;

ArrayList<String> songList = new ArrayList<String>();
Collections.sort(songList);

但是现在要用Song对象,而不是String,则无法通过编译。

按理来视频,ArrayList是一个List,它实现了List这个接口,应该没问题。但是编译器表示找不到ArrayList<Song>参数的sort()方法。

——> 那么ArrayList<Song>ArrayList<String>的区别在哪?为什么不行?

查看sort()函数的声明:

  • sort()函数大量运用到了泛型(generic)功能
  • 注意符号<>,它代表着泛型正在作用。

9.2 泛型

几乎所有会以泛型写的程序都与处理集合有关,它的主要目的是让人写出有类型安全性的集合,它意味着更好的类型安全性。

泛型的重要性:

  • 创建被泛型化类(如ArrayList)的实例。
    • new ArrayList<Song>()
  • 声明和指定泛型类型的变量。
    • List<Song> songList = new ArrayList<Song>
  • 声明与调用泛型类型的方法。
    • void foo(List<Song> list);
    • x.foo(songList);

使用泛型的类:

  • ArrayList是最常用的泛型化类型;它的类的声明如下:
    • 看上述代码中的E,会被编译器替换成实际的类型如String
    • E会被所指定的真正类型所取代,E也被称为类型参数

运用泛型的方法:

  • 泛型的方法代表方法的声明特征会用到类型参数;

  • 使用定义在类声明中的类型参数

    • public class Arraylist<E> extends AbstractList...{
          public boolean add(E o)
      }
      
  • 使用未定义在类声明的类型参数

    • public <T extends Animal> void takeThing(ArrayList<T> list){
          //T可以是任何一种Animal
      }
      
    • 如果类本身并没有使用类型参数,可以在方法的返回类型之前指定类型参数。

泛型与多态:

  • public <T extends Animal> void takeThing(ArrayList<T> list){
        //T可以是任何一种Animal
    }
    
    
    public void takeThing(ArrayList<Animal> list){
        
    }
    
  • 两者都合法,但意义完全不同。

    • <T extends Animal>是方法声明的一部分,表示任何被声明成AnimalAnimal的子型的ArrayList是合法的。因此可以用ArrayList<Dog>ArrayList<Cat>ArrayList<Animal>来调用上面的方法。
    • 下面方法的参数是ArrayList<Animal> list,代表只有ArrayList<Animal>是合法的。第二个方法只能使用AnimalArrayList
  • 数组的类型是在运行期间检查的,但集合的类型检查只会在发生在编译期间。

9.3 sort()的泛型详解

public static <T extends Comparable<? super T>> void sort(List<T> list)

根据上面的分析,可以看出sort()方法只能接受Comparable对象的的list

String的类声明:

  • 看得出来,Comparable是个有泛型的接口,用的是关键字implements

问题:sort()函数中使用extends,而String使用的implements,怎么回事?

  • 已泛型的观点,extends代表extendsimplements
  • 它代表”是一个.....",且不管是接口或类都能适用

所以想要对ArrayList<Song> songList使用Collections.sort(),必须要让Song类实现Comparable接口。

泛型的万用字符:

?

上面存在一种sort()方法的声明方式:

  • public static <T extends Comparable<? super T>> void sort(List<T> list)
    
  • 在返回类型前声明类型参数

还存在另外一种类型参数的声明方式:

  • public void takeThing(ArrayList<? extends Animal> list)
    
  • 两者结果一样。

  • 当参数存在多次T,则使用第一种更有效率。

  • 方法参数中使用万用字符时,编译器会阻止任何可以破坏引用参数所指集合的行为。

    • 即可以调用list中任何参数,但不能加入元素;

    • public void takeAnimal(ArrayList<? extends Animal> animals){
          for(Animal a : animals){
              a.eat();
          }//这个可以
          
          animals.add(new Cat());//这个不行,过不了编译
      }
      

Comparable接口:

  • public interface Comparable<T> {
        int compareTo(T o);
    }
    
  • java.lang.Comparable

  • 只有compareTo()这一个方法,负值表示传入的大,正值表示正执行的大,0代表相等。

  • //实现举例
    //Song类中title是String类型
    public int compareTo(Song s){
        return title.compareTo(s.getTitle());
    }
    

Comparator接口:

  • public interface Comparator<T> {
        int compare(T o1, T o2);
    }
    
  • java.util.Comparator

  • 存在另一种sort()方法,它取用Comparator参数。

    • sort(List<T> list, Comparator<? super T> c)
  • 使用Comparable接口,只能实现一种比较方式。但是可以做多个实现Comparator的类,每种类实现一种比较方式

标签:sort,ArrayList,list,类型,泛型,public
From: https://www.cnblogs.com/whxky/p/16980944.html

相关文章

  • TypeScript:带属性关联的泛型对象解构问题研究
    TypeScript:带属性关联的泛型对象解构问题研究2020-08-24 1236简介: ##背景###利用泛型进行属性关联大家在业务中一定很熟悉这样的场景,针对某个action,传递一个指定......
  • 简单易懂的 Go 泛型使用和实现原理介绍
    原文:​​AgentleintroductiontogenericsinGo​​by​​DominikBraun​​万俊峰Kevin:我看了觉得文章非常简单易懂,就征求了作者同意,翻译出来给大家分享一下。本文是......
  • Kotlin 和 Java 泛型的局限性、泛型擦除、星投影
    Hi大家好,我是DHL。公众号:ByteCode,专注分享有趣硬核原创内容,Kotlin、Jetpack、性能优化、系统源码、算法及数据结构、动画、大厂面经全文分为视频版和文字版,文字版:文......
  • 集合之泛型【Genericcs】
    packagecom.Lucky;importjava.util.ArrayList;importjava.util.Arrays;importjava.util.Iterator;/***泛型的应用场景:*1。如果我们在定义类/......
  • java list泛型简单的几种转换
     1.List<String>转 List<integer>、List<Long>1importjava.util.ArrayList;2importjava.util.List;3importjava.util.stream.Collectors;45publi......
  • 反射、注解、泛型项目中结合案例
    ......
  • C#泛型基础
    //泛型约束意义不会有类型安全问题让开发者合理调配//.NET支持的类型参数约束有以下五种://whereT:struct|T......
  • 6、泛型
    泛型1、 泛型可以在函数使用时才确定数据类型,而不是在声明时就确定数据类型,这样大大提高了函数的灵活性和数据类型的安全性,如下//<T>即为泛型,在定义时将类型作为参数//不......
  • CPP 如何将一个函数泛型化 How to Make a Function Generic
    1. Developinggenericfunction(设计泛型函数) 1.1.Steps(步骤) (1)    Tostartwithnon-genericfunction (先设计/编写一个非泛型函数)(2)   ......
  • 泛型—JAVA基础学习
    泛型泛型的简单了解为什么引入泛型?泛型可以视为编写代码时的语法检查这里可以通过一个简单的例子来看当不使用泛型时:classStove{ publicstaticObjectheat(Obj......