51. ワイルドカード

51. ワイルドカード

型変数を特定しない操作

L:\lesson122\test.java

class test {
    public static void main(String args[]) {
        printValue(new Value<String>("kitty on your lap"));
        printValue(new Value<Integer>(new Integer(10)));

        Value<?> obj;
        obj = new Value<String>("Test");
        printValue(obj);

        obj = new Value<Integer>(new Integer(10));
        printValue(obj);
    }

    static void printValue(Value<?> obj) {
        System.out.println("type  = " + obj.getValue().getClass());
        System.out.println("value = " + obj.getValue());
        System.out.println("");
    }
}

class Value<T> {
    private T value;
    public Value(T value) {
        this.value = value;
    }
    public void setValue(T value) {
        this.value = value;
    }
    public T getValue() {
        return value;
    }
}

実行結果

L:\lesson122>java test
type = class java.lang.String
value = kitty on your lap

type = class java.lang.Integer
value = 10

type = class java.lang.String
value = Test

type = class java.lang.Integer
value = 10

上限境界と下限境界

L:\lesson123\test.java

class test {
    public static void main(String args[]) {
        printNumber(new Value<Integer>(100));
        printNumber(new Value<Double>(1.23456789));
//      printNumber(new Value<String>("Kitty"));        // エラー

        printText(new Value<String>("Kitty"));
        printText(new Value<Object>(new Integer(10)));  // OK
//      printText(new Value<Integer>(new Integer(10))); // エラー
    }

    static void printNumber(Value<? extends Number> obj) {
        System.out.println("type         = " + obj.getValue().getClass());
        System.out.println("int value    = " + obj.getValue().intValue());
        System.out.println("double value = " + obj.getValue().doubleValue());
        System.out.println("");
    }

    static void printText(Value<? super String> obj) {
        System.out.println("type      = " + obj.getValue().getClass());
        System.out.println("int value = " + obj.getValue());
        System.out.println("");
    }
}

class Value<T> {
    private T value;
    public Value(T value) {
        this.value = value;
    }
    public void setValue(T value) {
        this.value = value;
    }
    public T getValue() {
        return value;
    }
}

実行結果

L:\lesson123>java test
type = class java.lang.Integer
int value = 100
double value = 100.0

type = class java.lang.Double
int value = 1
double value = 1.23456789

type = class java.lang.String
int value = Kitty

type = class java.lang.Integer
int value = 10