我知道大家都知道generic。
悬赏解释下列变量的具体解释,40分只给一个最佳答案:)
Collection<Object>;
Collection;//raw type
Collection<?>
Collection<? extends Object>;
Collection<T>;
悬赏解释下列变量的具体解释,40分只给一个最佳答案:)
Collection<Object>;
Collection;//raw type
Collection<?>
Collection<? extends Object>;
Collection<T>;
比如:Collection<Object> myObjects = new ArrayList<Object>();你的意图应该是持有任何Object,比如String,Integer...或是Collection<Object>, Collection<String> ...
所以你使用里面的元素也应该只是把他作为一个Object,不会对其类型转换。2. Collection, raw type collection. 没有类型安全保证,也没有任何泛型所带来的便利。
比如:class Stamp {}
class Coin {}
...
Collection myStamps = new ArrayList();
myStamps.add(new Stamp());
myStamps.add(new Coin());// 不会报错for(Iterator i = myStampes.iterator(); i.hasNext(); ) {
Stamp s = (Stamp)i.next(); //报错 ClassCastException
//...
}
...没有使用泛型,你本意是打算声明一个持有Stamp的Collection,却不小心放入了Coin,但编译器并不会报错,
所以你也因此付出了代价(ClassCastException)3. Collection<?> collection of some type。
你想用泛型,但是你不确定或者不关心实际类型参数是什么的时候,你就可以使用此种类型(无界通配符类型)。
那Collection<?> 和 raw type Collection有什么不同呢?答案就是 泛型可以保证类型安全,但是raw type不能!
Collection<?>,除了null,你不可能往里面添加任何其他类型的元素。4.Collection<? extends Object>; collection of some subtype of Object(小贴士:任何类型都是他本身的子类型)
看代码: class Container<Object> {
public void addAll(Collection<Object> objects) {
// some code here
}
} public class Test {
public static void main(String[] args) {
Container<Object> container = new Container<Object>();
Collection<Integer> integers = new ArrayList<Integer>();
container.addAll(integers); // 报错, 泛型和数组不一样,泛型不是协变类型的
// 比如: Object[] objs; Integer[] integers; ints 是
// objs的子类型;
// Container<Object> objs; Collection<Integer> ints, ins
// 可不是objs的子类型
} }
}将代码修改成
class Container<Object> {
public void addAll(Collection<? extends Object> objects) {
// some code here
}
} public class Test {
public static void main(String[] args) {
Container<Object> container = new Container<Object>();
Collection<Integer> integers = new ArrayList<Integer>();
container.addAll(integers); // 编译通过
} }
}
5. Collection<T> list of T
T 是一个类型参数(形式类型参数),T代表你的Collection中元素的类型;
class Collection<T> {
//.....
}
比如你是这样使用的
Collection<String> strings = ....; // String 是 实际类型参数,
// 说明你Collection中所有元素都是String类型的