zoukankan      html  css  js  c++  java
  • Happy Java:定义泛型参数的方法

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

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

    public class MyGeneric<T> {
    

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

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

    接下来,我们定义一个完整的类,其中包含ArrayList对象,用来存放''类型的对象,并在构造方法中实例化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);
        }
    }
    
  • 相关阅读:
    洛谷P2664 树上游戏(点分治)
    洛谷P3366 【模板】最小生成树(Boruvka算法)
    loj#2312. 「HAOI2017」八纵八横(线性基 线段树分治)
    noi.ac#309 Mas的童年(子集乱搞)
    loj#6041. 「雅礼集训 2017 Day7」事情的相似度(SAM set启发式合并 二维数点)
    Windows phone应用开发[22]-再谈下拉刷新
    Windows phone应用开发[21]-图片性能优化
    Windows phone应用开发[20]-禁止Pivot手势
    Windows phone应用开发[19]-RSA数据加密
    Windows phone应用开发[18]-下拉刷新
  • 原文地址:https://www.cnblogs.com/IcanFixIt/p/7696359.html
Copyright © 2011-2022 走看看