Java基础程序员技术

Java泛型基础

2016-03-31  本文已影响1210人  Di_xin

Java泛型基础

1. 认识泛型

访问权限 class 类名称<泛型, 泛型...>{
    属性
    方法
}
/**
 * 经纬度
 * 
 * @author dixin
 *
 */
class Point<T> {
    private T x;
    private T y;

    public T getX() {
        return x;
    }

    public void setX(T x) {
        this.x = x;
    }

    public T getY() {
        return y;
    }

    public void setY(T y) {
        this.y = y;
    }
}

public class GenericDemo01 {

    public static void main(String[] args) {

        Point<String> p1 = new Point<String>();
        p1.setX("经度为10");
        p1.setY("纬度为100");

        Point<Integer> p2 = new Point<Integer>();
        p2.setX(10);
        p2.setY(100);

        System.out.println(p1.getX() + ", " + p1.getY());
        System.out.println(p2.getX() + ", " + p2.getY());
    }
}

// 执行结果
经度为10, 纬度为100
10, 100

2. 构造方法中使用泛型

class Con<T> {

    private T value;
    // 类定义中已经定义泛型T, 方法中可以直接使用, 不用加<>
    public Con(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }
}

public class GenericDemo02 {

    public static void main(String[] args) {
        Con<String> c = new Con<String>("构造方法中使用泛型");
        System.out.println(c.getValue());
    }
}

3. 设置多个泛型

class Gen<K, T> {

    private K key;
    private T value;

    public K getKey() {
        return key;
    }

    public void setKey(K key) {
        this.key = key;
    }

    public T getValue() {
        return value;
    }

    public void setValue(T value) {
        this.value = value;
    }

}

public class GenericDemo03 {

    public static void main(String[] args) {
        Gen<String, Integer> gen = new Gen<String, Integer>();
        gen.setKey("key");
        gen.setValue(10);

        System.out.println(gen.getKey() + ", " + gen.getValue());
    }
}

4. 通配符

class Info<T> {

    private T value;

    public void setValue(T value) {
        this.value = value;
    }

    public T getValue() {
        return value;
    }

    @Override
    public String toString() {
        return this.getValue().toString();
    }
}

public class GenericDemo04 {

    public static void main(String[] args) {
        Info<String> i = new Info<String>();
        i.setValue("类型不统一");
        tell(i); // 编译报错
        // The method tell(Info<Object>) in the type GenericDemo04 is not applicable for the arguments 
 (Info<String>)
    }

    public static void tell(Info<Object> i) {
        System.out.println(i);
    }
}

原因:
泛型是不可变的, 对于任意两个不同的类型Type1和Type2, List<Type1>既不是List<Type2>的子类型, 也不是List<Type2>的父类型. 所以这里不能将<String>转换成<Object>.

解决方式:

5. 泛型接口

interface IGen<T> {
    public void say();
}

class GenImpl<T> implements IGen<T> {

    private String info;

    public GenImpl(String info) {
        this.info = info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    public String getInfo() {
        return info;
    }

    @Override
    public void say() {
        System.out.println(this.info);
    }
}

public class GenericDemo05 {

    public static void main(String[] args) {
        IGen<String> g = new GenImpl<String>("泛型接口");
        g.say();
    }
}

6. 泛型方法

public class GenericDemo06 {

    public static void main(String[] args) {
        String str = tell("Hello");
        System.out.println(str);
        int i = tell(10);
        System.out.println(i);
    }
    
    // <T>是第一泛型参数, 写在访问权限和static后面
    public static <T> T tell(T t) {
        return t;
    }
}

// 执行结果
Hello
10

7. 泛型数组

泛型数组的使用要和泛型方法搭配使用.

public class GenericDemo07 {

    public static void main(String[] args) {

        String arrStr[] = { "A", "B", "C" };
        tell(arrStr);

        Integer arrInt[] = { 1, 2, 3 };
        tell(arrInt);
    }

    public static <T> void tell(T arr[]) {
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
    }
}
上一篇 下一篇

猜你喜欢

热点阅读