【发布时间】:2012-01-15 09:48:22
【问题描述】:
Class<? extends Something>
这是我的解释,它是类模板,但类?表示类的名称未确定,它扩展了 Something 类。
如果我的解释有问题,请告诉我。
【问题讨论】:
-
那个?表示该类的
type未确定,但可以保证扩展Something
Class<? extends Something>
这是我的解释,它是类模板,但类?表示类的名称未确定,它扩展了 Something 类。
如果我的解释有问题,请告诉我。
【问题讨论】:
type 未确定,但可以保证扩展Something
这里有一些令人困惑的答案,所以我会尝试解决这个问题。 你这样定义一个泛型:
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();
或
DoSomething(List<? extends Bar> listOfBarObjects) {
//internals
}
【讨论】:
你几乎是对的。
基本上,Java 没有模板的概念(C++ 有)。
这称为泛型。
这定义了一个泛型类Class<>,泛型的属性是Something 的任何子类。
如果你想了解模板和泛型之间的区别,我建议阅读“What are the differences between “generic” types in C++ and Java?”。
【讨论】:
你是对的
定义是类必须是Something的子类型
和Class<T>一样,但是有一个条件T必须extends Something
或者 implements Something Anthony Accioly 建议的
也可以是类Something本身
【讨论】:
Something接口...在处理泛型时“extends”用于两者。
你是对的。
在 Java 泛型中,? 运算符表示“任何类”。 extends 关键字可用于将其限定为“任何扩展/实现Something(或是 Something)的类。
因此您有“某个类的Class,但该类必须是或扩展/实现Something”。
【讨论】:
? 在技术上不是 操作员。
你是对的。
但是通常你会想要命名扩展Something的类并写例如<E extends Something>。如果你使用?,你以后不能对给定的类型做任何事情。
【讨论】: