泛型1:介绍及基本使用方式

前言

  • 泛型实现了参数化类型的概念;
  • 泛型的主要目的之一是用来指定容器要持有什么类型的对象,编译器保证类型的正确性;
  • 多态也是一种泛化机制;
  • 基本类型无法作为类型参数;

    一.基本使用方式

      泛型基本分为泛型类型和泛型方法两种,泛型类型声明方式为类型参数用尖括号括住,放在类名后边,泛型方法的参数列表应该置于返回值之前。示例如下:

//泛型类
package java.lang;

public interface Iterable<T> {
    Iterator<T> iterator();

    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

    default Spliterator<T> spliterator() {
         return Spliterators.spliteratorUnknownSize(iterator(), 0);
    }
}

//泛型方法
public class GenericMethods{
    public <T> void f(T t){
        System.out.println(t.getClass().getName());
    }
}
  • 应该优先使用泛型方法,而非将泛型应用到整个类上;
  • 泛型的核心概念是告诉编译器想使用什么类型,然后让编译器处理细节.

二.使用场景

1.元组类库

  即当调用一个方法希望返回多个对象时,需要将一组对象直接打包存储在一个对象中——这也是元祖的概念。元组中的对象可以是不同的类型。示例代码如下:

//二维元祖
public class TwoTuple<A,B>{
    public final A first;//fixme 注意是final类型的
    public final B second;

    public TwoTuple(A first, B second) {
        this.first = first;
        this.second = second;
    }
}

//使用继承机制实现的三维元祖
class ThreeTuple<A,B,C> extends TwoTuple<A,B>{
    public final C third;

    public ThreeTuple(A first, B second, C third) {
        super(first, second);
        this.third = third;
    }
}
  • 使用继承机制实现更长的元组;
  • 变量为final类型保证了元组对象被创建后,final元素便不能被改变了;
    2.实现堆栈类

      可以使用泛型类实现自定义的链表栈,示例如下:

    ```

    package fanxing;

public class LinkedStack

    public Node(U item, Node<U> next) {
        this.item = item;
        this.next = next;
    }
    //末端哨兵(end sentinel)
    boolean end(){
        return item==null&&next==null;
    }
}
private Node<T> top=new Node<>();
//每push一次都会创建一个对象并放到栈尾
public void push(T item){
    top=new Node<>(item,top);
}

public T pop(){
    T result=top.item;
    if(!top.end()){
        top=top.next;
    }
    return result;
}

public static void main(String[] args) {
    LinkedStack<String> lss=new LinkedStack<>();
    for(String str:"du gen kui".split(" "))
        lss.push(str);
    String s;
    while((s=lss.pop())!=null)
        System.out.println(s);
}

}

```

3.用于工厂方法设计模式

  泛型可以用于接口,比如生成器(generator),工厂方法设计模式是其一中应用。例如crawl4j中的工厂方法:

public interface WebCrawlerFactory<T extends WebCrawler> {
    T newInstance() throws Exception;
}

//补充:默认工厂的实现
class DefaultWebCrawlerFactory<T extends WebCrawler> implements WebCrawlerFactory<T>{
    final Class<T> claz;
    DefaultWebCrawlerFactory(Class<T> clz){ this.clz=clz;}

    @Override
    public T newInstance() throw Exception{
        try{
            return clz.newInstance();
        }catch(ReflectiveOperationException e){
            throw e;
        }
    }
}
4.补充:可变参数列表

  将方法参数项写成T... x的形式就可以将其作为可变参数列表。示例如下:

public class VariableParam<T> {

    public void testFunc(T... params){
        for (T ele:params) {
            System.out.println(ele.toString());
        }
    }

    public static void main(String[] args) {
        new VariableParam<String>().testFunc("du","gen","kui");
    }
}

原文地址:https://www.cnblogs.com/dugk/p/8900788.html

时间: 2024-08-07 11:00:12

泛型1:介绍及基本使用方式的相关文章

OC的泛型使用介绍

一.泛型的介绍 1.泛型就是没有规定类型,在使用的时候决定类型 2.最早的泛型是C++ template 3.c#将泛型发挥的淋漓尽致 4.swift中首次引用泛型 5.新的xcode 在swift影响下给OC加入了泛型(违泛型) 二.泛型的使用 1.泛型的作用就是可以限制内容的类型 2.正常的情况下,数组中存放的是id对象,如果我们想也要使用点语法,必须进行强转. 3.如果我们使用泛型的话,可以限制里面的内容,如果传入的不是Person类型的对象就会有警告 4.好处:我们可以直接通过点语法访问

Java泛型学习笔记 - (一)泛型的介绍

一.什么是泛型:泛型的作用是用来规定一个类, 接口或方法所能接受的数据的类型. 就像在声明方法时指定参数一样, 我们在声明一个类, 接口或方法时, 也可以指定其"类型参数", 也就是泛型. 不同的是, 声明方法时我们给其参数指定一个值, 而给其泛型指定一个数据类型.二.基本使用方式: 上面的概念啰嗦了许多, 其实我自己写的都累. 最简单有效的学习方法就是用一用嘛: 1 List<String> list = new ArrayList<String>(); 这就

java泛型探索——介绍篇

1. 泛型出现前后代码对比 先来看看泛型出现前,代码是这么写的: List words = new ArrayList(); words.add("Hello "); words.add("worlds!"); String s = (String) words.get(0) + (String) words.get(1); System.out.println(s.equals("Hello worlds!")); 而泛型出现后无需做显式转换:

Java中泛型的介绍与简单使用

学习目标 掌握泛型的产生意义. 掌握泛型的基本使用. 了解泛型的警告信息及泛型的擦除. 泛型是在JDK1.5之后增加的内容,泛型(Generic) 使用泛型的原因 题目分析: 首先要考虑到,必须建立一好一个表示坐标点的类--Point,此类中有两个属性分别用来表示x坐标和y坐标,但是x和y中所保存的整数类型会有三种(int.float.String),而要想使用一个类型可以同时接收这样的三种类型数据,现在只能使用Object,因为Object类可以接收任何类型的数据,都会自动发生向上转型操作,这

spring Boot构建的Web应用中,基于MySQL数据库的几种数据库连接方式进行介绍

包括JDBC.JPA.MyBatis.多数据源和事务. 一.JDBC 连接数据库 1.属性配置文件(application.properties) spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driv

QList介绍(QList比QVector更快,这是由它们在内存中的存储方式决定的。QStringList是在QList的基础上针对字符串提供额外的函数。at()操作比操作符[]更快,因为它不需要深度复制)非常实用

FROM:http://apps.hi.baidu.com/share/detail/33517814 今天做项目时,需要用到QList来存储一组点.为此,我对QList类的说明进行了如下翻译. QList是一种表示链表的模板类.QList<T>是Qt的一种泛型容器类.它以链表方式存储一组值,并能对这组数据进行快速索引,还提供了快速插入和删除等操作.QList.QLinkedList和QVector提供的操作极其相似:* 对大多数操作来说,我们用QList就可以了.其API是基于索引(inde

iOS 强大的泛型,同样也可以对UIButton进行扩展

文章围绕这五点: 1. 泛型是什么 2. 为什么要用泛型 3. 泛型怎么用 4. 泛型进阶 5. 泛型的延伸使用 泛型(Generics)是什么? 引用Apple中Generics的描述: Generic code enables you to write flexible, reusable functions and types that can work with any type, subject to requirements that you define. You can writ

深入理解C#泛型

前面两篇文章介绍了C#泛型的基本知识和特性,下面我们看看泛型是怎么工作的,了解一下泛型内部机制. 泛型内部机制 泛型拥有类型参数,通过类型参数可以提供"参数化"的类型,事实上,泛型类型的"类型参数"变成了泛型类型的元数据,"运行时"在需要的时候会利用他们构造恰当的类型,通过这些类型,我们有可以实例化不同类型的对象.也就是说,未绑定泛型类型是以构造泛型类型的蓝图,已构造泛型类型又是实际对象的蓝图. 分析泛型IL代码 下面看一个例子,在这个例子中定义

计算机程序的思维逻辑 (37) - 泛型 (下) - 细节和局限性

35节介绍了泛型的基本概念和原理,上节介绍了泛型中的通配符,本节来介绍泛型中的一些细节和局限性. 这些局限性主要与Java的实现机制有关,Java中,泛型是通过类型擦除来实现的,类型参数在编译时会被替换为Object,运行时Java虚拟机不知道泛型这回事,这带来了很多局限性,其中有的部分是比较容易理解的,有的则是非常违反直觉的. 一项技术,往往只有理解了其局限性,我们才算是真正理解了它,才能更好的应用它. 下面,我们将从以下几个方面来介绍这些细节和局限性: 使用泛型类.方法和接口 定义泛型类.方