美文网首页程序员java进阶干货
Happy Java:定义泛型参数的方法

Happy Java:定义泛型参数的方法

作者: 码匠安徒生 | 来源:发表于2017-10-19 23:45 被阅读347次

在平时写代码时,可以自定义泛型类。当使用同一类型的对象时,这是非常有用的,但在实例化类之前,我们不知道它将是哪种类型。

下面让我们定义一个使用泛型参数的方法。首先,在定义一个类用到泛型时,必须使用特殊语法来支持这种类型。在下面的例子中,<T>表示定义的类将要使用的类型:

public class MyGeneric<T> {

当然,也可以定义泛型中包含多个类的类型,比如java.util.Map

public class MyGeneric<T, U, V> {  }

接下来,我们定义一个完整的类,其中包含ArrayList对象,用来存放'<T>'类型的对象,并在构造方法中实例化ArrayList对象。

import java.util.ArrayList;

public class MyGeneric<T> {

    private ArrayList<T> list;

    public MyGeneric() {
        list = new ArrayList<T>();
    }

    public void add(T element) {
        list.add(element);
    }
}

需要注意的是,我们实际上并不是处理一个名为T的类。相反,T是用于创建MyGeneric实例时使用的类型。 Java规范允许使用所需的任何标识符,但标准约定是使用单个大写字母将其与正常类名称区分开来。 现在我们已经将add方法定义为T类型的参数,只能使用与MyGeneric实例构造相同的类型。 以下代码是非法的,并产生编译错误:

MyGeneric<String> rs = new MyGeneric<>();
rs.add(1);     // illegal for a MyGeneric<String>

如果要从方法返回泛型类型,则可以将其作为方法签名的返回类型,定义所示:

SecureRandom random = new SecureRandom();
// 省略其他代码

 public T getRandomElement() {
    int index = random.nextInt(list.size());
    return list.get(index);
 }

getRandomElement方法返回类型与定义类的类型是一致的。现在,我们就可以使用上面的方法,来构建类型实例。

public static void main(String [] args) {
    MyGeneric<String> names = new MyGeneric<>();
    names.add("zhangsan");
    names.add("lisi");
    names.add("wangwu");
    names.add("zhaoliu");
    
    // 随机获取list的一个元素
    String name = names.getRandomElement();
    System.out.println(name);
}

String类型变量names的赋值是安全的,我们将始终从getRandomElement方法获取一个字符串。 这只是因为我们使用String类型构造了MyGeneric实例。 addgetRandomElement方法的定义与构造函数的定义具有相同的类型,编译器将强制执行此约束。 让我们尝试在构造函数中使用不同类型的MyGeneric类,这次使用我们Integer类:

MyGeneric<Integer> numbers = new MyGeneric<>();
    numbers.add(1);
    numbers.add(2);
    numbers.add(3);
    numbers.add(4);
    
    Integer oneNumber = numbers.getRandomElement();
    System.out.println(oneNumber);

你可以在需要类处理某些类型的对象(在构建类之前不知道),以及希望编译器严格执行类型限制的情况下定义自己的泛型。这样做的主要优点是安全和方便。

最后,附上完整的示例代码:

package wicked.coo;

import java.security.SecureRandom;
import java.util.ArrayList;

/**
 * 
 * @author i324779
 *
 * @param <T> 自定义泛型
 */
public class MyGeneric<T> {
    
    SecureRandom random = new SecureRandom();
    
    private ArrayList<T> list;

    public MyGeneric() {
        list = new ArrayList<T>();
    }

    public void add(T element) {
        list.add(element);
    }
    
    public T getRandomElement() {
        int index = random.nextInt(list.size());
        return list.get(index);
    }
    
    public static void main(String [] args) {
        MyGeneric<String> names = new MyGeneric<>();
        names.add("zhangsan");
        names.add("lisi");
        names.add("wangwu");
        names.add("zhaoliu");
    
        // 随机获取list的一个元素
       String name = names.getRandomElement();
       System.out.println(name);
    
        MyGeneric<Integer> numbers = new MyGeneric<>();
        numbers.add(1);
        numbers.add(2);
        numbers.add(3);
        numbers.add(4);
    
        Integer oneNumber = numbers.getRandomElement();
        System.out.println(oneNumber);
    }
}

相关文章

  • Happy Java:定义泛型参数的方法

    在平时写代码时,可以自定义泛型类。当使用同一类型的对象时,这是非常有用的,但在实例化类之前,我们不知道它将是哪种类...

  • Java 泛型

    Java 泛型 什么是泛型 泛型,即“参数化类型”。一提到参数,最熟悉的就是定义方法时有形参,然后调用此方法时传递...

  • Java 语法糖及实现

    Java 中的泛型 泛型是什么 泛型,即“参数化类型”,最熟悉的就是定义方法时有形参,然后调用此方法时传递实参。 ...

  • Java泛型

    参考:Java知识点总结(Java泛型) 自定义泛型类 自定义泛型接口 非泛型类中定义泛型方法 继承泛型类 通配符...

  • 泛型的用法

    一、泛型方法1、函数的参数是泛型下面是定义泛型方法的规则:所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔)...

  • 泛型学习

    1.泛型是Java中参数化类型的方式。将类型也作为一种参数进行传递。2.它有泛型的方法,泛型参数,泛型类。3.泛型...

  • Java中的泛型

    泛型方法 下面是定义泛型方法的规则: 所有泛型方法声明都有一个类型参数声明部分(由尖括号分隔),该类型参数声明部分...

  • Java泛型(一)

    一、泛型的定义 1、什么是java泛型?泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操...

  • java泛型中类型擦除的一些思考

    java泛型 java泛型介绍 java泛型的参数只可以代表类,不能代表个别对象。由于java泛型的类型参数之实际...

  • Java泛型教程

    Java泛型教程导航 Java 泛型概述 Java泛型环境设置 Java泛型通用类 Java泛型类型参数命名约定 ...

网友评论

    本文标题:Happy Java:定义泛型参数的方法

    本文链接:https://www.haomeiwen.com/subject/jbzpuxtx.html