Class<? extends Something>
这是我的解释,它是班级模板但课程?表示类的名称未确定,它扩展了Something类。
如果我的解释有问题,请告诉我。
答案 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 Something
或implements Something
作为Anthony Accioly建议
它也可以是Something
类本身
答案 3 :(得分:4)
你是对的。
在Java泛型中,?
运算符表示“任何类”。 extends
关键字可用于将其限定为“任何扩展/实施Something
的类(或 Something
)。
因此,您拥有“某个类的Class
,但该类必须是或扩展/实现Something
”。
答案 4 :(得分:3)
你是对的。
但是通常你会想要命名扩展Something的类并写下例如<E extends Something>
。如果您使用?
,则以后无法对给定类型执行任何操作。