lilzz
lilzz

Reputation: 5413

in Java syntax, Class<? extends Something>

Class<? extends Something>

Here's my interpretation, it's class template but the class ? means the name of the class is undetermined and it extends the Something class.

if there's something wrong with my interpretation, let me know.

Upvotes: 67

Views: 90547

Answers (5)

Daniel Moses
Daniel Moses

Reputation: 5858

There are a few confusing answers here so I will try and clear this up. You define a generic as such:

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

If you want a generic on Foo to always extend a class Bar you would declare it as such:

public class Foo<T extends Bar> {
    private T t;
    public void setValue(T t) {
        this.t = t;
    }
    public T getValue() {
        return t;
    }
}

The ? is used when you declare a variable.

Foo<? extends Bar>foo = getFoo();

OR

DoSomething(List<? extends Bar> listOfBarObjects) {
    //internals
}

Upvotes: 53

Jan Vorcak
Jan Vorcak

Reputation: 19989

You're right

Definition is that the class has to be subtype of Something

It's the same as Class<T>, but there is a condition that T must extends Something Or implements Something as Anthony Accioly suggested

It can also be class Something itself

Upvotes: 10

Mac
Mac

Reputation: 14791

You're correct.

In Java generics, the ? operator means "any class". The extends keyword may be used to qualify that to "any class which extends/implements Something (or is Something).

Thus you have "the Class of some class, but that class must be or extend/implement Something".

Upvotes: 9

Krizz
Krizz

Reputation: 11542

You are almost right. Basically, Java has no concept of templates (C++ has). This is called generics. And this defines a generic class Class<> with the generics' attribute being any subclass of Something.

I suggest reading up "What are the differences between “generic” types in C++ and Java?" if you want to get the difference between templates and generics.

Upvotes: 37

Thomas Ahle
Thomas Ahle

Reputation: 31604

You're correct.

However usually you will want to name the class that extends Something and write e.g. <E extends Something>. If you use ? you can't do anything with the given type later.

Upvotes: 4

Related Questions