java 泛型的简单使用

effecttive java一直推荐使用泛型,简单的看了一下泛型的使用

package cn.com.fzk;

import java.util.ArrayList;
import java.util.List;

public class Test1 {
    public static class InnerStaticGeneric<T> {
        T t;
        InnerStaticGeneric<T> instance = new InnerStaticGeneric<T>();

        public static <T> InnerStaticGeneric<T> getInstance() {
            return new InnerStaticGeneric<T>();
        }
    }

    public static void main(String[] args) {
        String a = "a";
        GenericTest.w(a);
        Integer b = 1;
        GenericTest.w(b);
        
    }
}

class GenericTest<T> {
    public GenericTest() {
    }

    T t;

    List<T> list = new ArrayList<T>();

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

    public T get(int index) {
        return list.get(index);
    }

    public static <T> GenericTest<T> getInstance() {
        return new GenericTest<T>();
    }

    public static <W> void w(W w) {
        System.out.println(w.getClass().getName());
    }

    public static <Q> void q(Q q) {
        System.out.println(q.getClass().getName());
    }

    public void t(T t) {
        System.out.println(t.getClass());
    }

     public <E> void e(E e) {
          System.out.println(e.getClass());
      }

}

定义泛型类的时候,<>中的类型随便写,一个大写的字母就可以。在非静态方法中使用到的泛型的类型如果和定义的泛型类的大写的那个字母一样,就不需要制定类型了。如果方法中的泛型的类型未定义需要在方法中制定类型,在e()方法中的那个<E>就是相当于临时定义了一个类型E,如果不定义编译通不过。

静态方法中如果要使用泛型,前边必须定义这个临时类型。如果泛型类中定义了静态方法,其实这个静态方法中的泛型和泛型类中定义的泛型已经没有意义了。泛型在Java中本身就是一个语法糖,在编译的时候已经编译成了实际的类型,是动态的翻译类型,而静态方法是类未编译前就已经编译了,也就是静态方法中所有的类型都是已经确定好的。在泛型类中使用静态方法用来操作我感觉是没有意义的,唯一可能的原因就是这个静态方法从理论上来说应该属于这个类(单一职责)。同时也说明,任何一个非泛型类中,都可以定义一个泛型方法。向下面这样创建一个类及方法也是可以的。这种情况下,定不定义泛型类没有什么意义。

class GenericTest {
    public static <W> void w(W w) {
        System.out.println(w.getClass().getName());
    }

    public static <Q> void q(Q q) {
        System.out.println(q.getClass().getName());
    }

    public <E> void e(E e) {
        System.out.println(e.getClass());
    }
}

如果想定义一个泛型类,在使用这个泛型类并且还想让这个泛型类定义出来的泛型起作用的话那么就不要用静态方法来操作泛型,new出这个泛型类在调用相应的方法。同时说明,泛型类做不了静态方法工具类。这是我的感觉。不知道是不是有问题。

原文地址:https://www.cnblogs.com/badboyf/p/6636797.html