java泛型程序设计——定义简单泛型类+泛型方法

【0】README

0.1) 本文描述+源代码均 转自 core java volume 1, 旨在理解 java泛型程序设计 的 定义泛型类+泛型方法的知识

【1】一个泛型类: 就是具有一个或多个类型变量的类;

1.1)看个荔枝:

public class Pair<T> {
    private T first;
    private T second;
    public Pair() { first = null; second = null; }
    public Pair(T first, T second) { this.first = first; this.second = second; }
    public T getFirst() { return first; }
    public T getSecond() { return second; }
    public void setFirst(T newValue) { first = newValue; }
    public void setSecond(T newValue) { second = newValue; }
}

对以上代码的分析(Analysis):

  • A1) Pair类引入了一个类型变量T,用尖括号(<>) 括起来, 并放在类名的后面;
  • A2)泛型类可以有多个类型变量, 如, 定义 Pair 类, 其中第一个和第二个域使用不同的类型: public class Pair
Pair<String>();
Pair<String>(String , String);

和方法:

String getFirst()
String getSecond()
void setFirst(String)
void setSecond(String)
  • 1.2.2)一句话说完: 泛型类可以看做普通类的工厂;

1.3)看个荔枝:

【2】 泛型方法

2.1)如何定义一个带类型参数的泛型方法:

class ArrayAlg
{
    public static<T> T getMiddle(T... a)
    {
        return a[a.length / 2];
    }
}
  • 2.1.1)当调用一个泛型方法时, 在方法名前的尖括号中放入具体的类型:
String middle = ArrayAlg.<String>getMiddle("john", "Q.", public ");
  • 2.1.2)其实, 方法调用中可以省略 类型参数, 编译器有足够的信息能偶推断出所调用的方法;也就是说, 可以调用
String middle = ArrayAlg.getMiddle("john", "Q.", public ");

2.2)在大多数情况下, 对于泛型方法的引用都没有问题。 偶尔, 编译器也会提示错误,看个荔枝:

double middle = ArrayAlg.getMiddle(3.14, 0, 1729);
  • 2.2.1)简单地说, 编译器将会自动打包参数为 1个 Double 和 2个Integer 对象,而后寻找这些类的共同超类型。
  • 2.2.2)事实上, 找到2个这样的超类型:Number 和 Comparable 接口, 其本身也是一个泛型类型。 在这种情况下, 可以采取的补救措施是 将 所有的参数写为 double 值;

Hint)

  • H1)如果想要知道 编译器对一个泛型方法调用最终推断出哪种类型, 某某人推荐一个方法:有目的地引入一个错误, 并研究所产生的错误消息。
  • H2)例如,看一下调用 ArrayAlg.getMiddle(“hello”, 0, null), 这是肯定错误 的, 将会得到错误报告:

    大致的意思是:可以将结果赋值给 Object、Serialiable 或 Comparable;

你可能感兴趣的:(java,泛型方法,泛型类)