在Java语法中,Class <! - ?扩展某事 - >

时间:2011-12-07 21:29:36

标签: java generics

Class<? extends Something>

这是我的解释,它是班级模板但课程?表示类的名称未确定,它扩展了Something类。

如果我的解释有问题,请告诉我。

5 个答案:

答案 0 :(得分:39)

这里有一些令人困惑的答案,所以我会尝试清除它。 您可以定义泛型:

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

如果你希望Foo上的泛型总是扩展一个类Bar,你可以这样声明它:

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

声明变量时使用?

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

OR

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

答案 1 :(得分:32)

你几乎是对的。 基本上,Java没有模板的概念(C ++有)。 这称为泛型。 这定义了一个泛型类Class<>,泛型'属性是Something的任何子类。

如果您希望获得模板和泛型之间的区别,我建议您阅读“What are the differences between “generic” types in C++ and Java?”。

答案 2 :(得分:10)

你是对的

定义是该类必须是Something的子类型

Class<T>相同,但有一个条件T必须extends Somethingimplements Something作为Anthony Accioly建议

它也可以是Something类本身

答案 3 :(得分:4)

你是对的。

在Java泛型中,?运算符表示“任何类”。 extends关键字可用于将其限定为“任何扩展/实施Something的类(或 Something)。

因此,您拥有“某个类的Class,但该类必须是或扩展/实现Something”。

答案 4 :(得分:3)

你是对的。

但是通常你会想要命名扩展Something的类并写下例如<E extends Something>。如果您使用?,则以后无法对给定类型执行任何操作。