泛型 - 类、方法和接口

2018-11-26  本文已影响0人  平头哥2015

泛型类

泛型类的语法

一个类型参数的泛型类

// 声明
public class Generic<T> {

    private T obj;

    public Generic(T obj) {
        this.obj = obj;
    }
    
    // ...
}

// 实例化
Generic<Integer> iInstance = new Generic<Integer>(100);
Generic<String> sInstance = new Generic<>("test"); // 类型推断

两个类型参数的泛型类

public class Generic<T, V> {
    private T first;
    private V second;
    
    public Generic(T first, V second) {
        this.first = first;
        this.second = second;
    }
    
    // ...
}

Generic<Integer, String> instance = new Generic<Integer, String>(100, "test");

注意:

Generic<int> instance = new Generic<int>(100);
Generic<Integer> iInstance = new Generic<Integer>(100);
Generic<String> sInstance = new Generic<String>("test");
iInstance = sInstance;

类型边界

可以通过为类型参数声明超类来限定类型参数的边界。声明语法如下所示:
<T extends superclass>
这样就指定了T只能是superclass或其子类。

下面这个例子中sum()调用了Number类的doubleValue方法,如果不指定类型边界为Number,就会编译失败,提示doubleValue()方法是未知的。

public class Calculator<T extends Number> {

    private T[] nums;

    public Calculator(T[] nums) {
        this.nums = nums;
    }

    public double sum() {
        double s = 0.0;
        for (T num : nums) {
            s += num.doubleValue();
        }
        
        return s;
    }

}

除了可以使用类作为边界,还可以指定接口作为边界,而且边界可以是一个类和一个或多个接口。类型参数必须同时满足超类和接口的限制才是合法的。例如:

public class Generic<T extends MyClass & MyInterface> { // ... }

泛型方法

泛型类中的方法可以使用类的类型参数,所以它们是自动相对于类型参数泛型化的。此外,在非泛型类中也可以创建泛型方法。

泛型方法的语法

泛型方法的例子

public <T extends Number> boolean check(T num) {
    // ...
}

泛型构造函数的例子

public <T extends Number> Generic(T num) {
    // ...
}

泛型接口

除了可以定义泛型类和泛型方法外,还可以定义泛型接口。

泛型接口的语法

例子

public interface MinMax<T extends Comparable<T>> {

    T min();
    
    T max();

}

public class MyClass<T extends Comparable<T>> implements MinMax<T> {

    private T[] values;
    
    // ...

}

注意:

public class MyClass<T extends Comparable<T>>
        implements MinMax<T extends Comparable<T>> {
    // ...
}
public class MyClass implements MinMax<T> {
    // ...
}
public class MyClass implements MinMax<Integer> {
    // ...
}
上一篇 下一篇

猜你喜欢

热点阅读