此处仅通过一示例说明泛型类与泛型方法使用上的区别,非泛型详细说明。主要是泛型类、泛型方法、普通方法代码结构上的区别,不当处欢迎大家指正。

public class GeneralTest<F> {

    public <E> E getFirst(E... c) {//A.【泛型类】中的【泛型方法】
        E e = c[0];
        return e;
    }

    public static <T> T getMiddle(T... a) {//B.【泛型类】中的静态【泛型方法】
        return a[a.length / 2];
    }

    public F getLast(F... b) {//C.【泛型类】中的【标准方法】
        return b[b.length - 1];
    }
    
//    public G getElse(G... b) {//D.【泛型类】中变量、返回值、方法参数必须是类声明时包含的类型(T、F...)
//        return b[b.length - 1];
//    }

    public String getSth(String... b) {//E.【泛型类】中的【普通方法】
        return b[b.length - 1];
    }
    
    public Object getSth(Object o) {//F.【泛型类】中的【普通方法】
        return o;
    }

    public static void main(String[] args) {
        Integer[] intarry = { 1, 2, 3, 4, 5, 6 };
        String[] strarry = { "a", "b", "c", "d","e" };
        
        GeneralTest<Integer> arrayAlg = new GeneralTest<Integer>();//泛型类声明参数类型为Integer
        
        //getFirst为泛型方法,因此可接受任意类型的参数
        Integer ii = arrayAlg.getFirst(intarry);//此处传入Integer类型参数
        System.out.println(ii);
        String ss = arrayAlg.getFirst(strarry);//此处传入String类型参数
        System.out.println(ss);
        
        //getMiddle为静态泛型方法,用法同getFirst,因此可接受任意类型的参数
        ii = getMiddle(intarry);
        System.out.println(ii);
        ss = getMiddle(strarry);
        System.out.println(ss);

        //getLast为泛型类的标准方法(用词可能不恰当,望包涵、指正),仅接受ArrayAlg实例化时指定的参数类型
        ii = arrayAlg.getLast(intarry);
        System.out.println(ii);
//        ss = arrayAlg.getLast(strarry);//getLast为泛型类声明的方法,在对象实例化时已经确定了仅接受Integer类型参数
//        System.out.println(ss);

        ss = arrayAlg.getSth(strarry);//泛型类中的普通方法
        System.out.println(ss);
    }
}

小结:

泛型类中可以有

A.标准的方法(方法参数类型与类声明一致),且方法调用时,参数类型在对象实例化时指定,不可接受其它类型的参数。

B.泛型方法(方法参数由该方法控制,不受类声明参数类型影响)

C.指定返回类型及参数类型的普通方法

另外,泛型方法不是一定要在泛型类中定义,普通类也可定义泛型方法。