Java generic class & wildcards

I have a generic Box class with the following function:

  • one of methods 2 putshould allow the client to insert a field and get its contents in the current field.

I want this method to get two types of boxes: Box<Number>and Box<Integer>, therefore, I changed the method put(Box<T>)to put(Box<? extends Number> box). But I get a compilation warning. What am I doing wrong here?

This is my current code: warning I get: Security Type: Unchecked throw from capture # 1-of? extends the number to T

public class Box<T> {
    public T get() {
        return element;
    }

    public void put(T element) {
        this.element = element;
    }

    public void put(Box<? extends Number> box) {
        put((T) box.get()); // this is where i get the warning
    }

    private T element;
}

public class BoxClient {

    public static void main(String[] args) {
        Box<Number> nBox = new Box<Number>();
        Box<Integer> iBox = new Box<Integer>();
        nBox.put(iBox);

    }

}
+4
source share
5 answers

Box T. T . ", "

Box<? extends Number>. ", ".

:

public void put(Box<? extends Number> box) {
    put(box.get());
}

", ", T. , T , -, . :

public class BoxClient {

    public static void main(String[] args) {
        Box<String> sBox = new Box<String>();
        Box<Integer> iBox = new Box<Integer>();

        iBox.put(1);
        sBox.put(iBox);

        System.out.println(sBox.get()); 
    } 

}

Box<String> "A Box " Box<Integer> "A Box, ". generics , T , ,

java.lang.ClassCastException: java.lang.Integer java.lang.String

, Integer 1 String.

, , Box, T extends Number, :

public class Box<T extends Number> {
    public T get() {
        return element;
    } 

    public void put(T element) {
        this.element = element;
    }

    public void put(Box<? extends T> box) {
        put((T) box.get());
    }

    private T element;
}

UPDATE: , . , Box<Number> Box<Integer>, .

bayou.io. , , : 1: 2: , T

UPDATE2: newacct, T .

, !

+1

public void put(Box<? extends T> box) {
    put(box.get());
}
+6

, :

public void put(Box<? extends Number> box) {
    put( (T) box.get());
}

:

: java.lang.Number T

, T , - , Object.

box , , Number.

(T) box.get() "", box.get() Number T , String. , , ClassCastException. .

+3

T, ( ). Number ( Number), : class Box<T extends Number>. : put(Box<? extends T> box), T .

+1

, Java 5. - .

:

public abstract class Draft<T> {
    public abstract void put(T element);
    public abstract void putDraft(Draft draft);
}

.

, .

0

All Articles