繁体   English   中英

getClass返回什么类型?

[英]What type does getClass return?

这是我的代码:

Set<Class<Event>> s = new HashSet<>();             
Set<Class<? extends Event>> s2 = new HashSet<>();
Event e = new Event();                         

s.add(e.getClass());   // #1
s2.add(e.getClass());  // #2

class Event {
    // ...
}

为什么编译器会在语句#1上引发错误?

我正在使用Java 7。

如果你看一下getClass()方法的文档,你会看到它

实际的结果类型是Class<? extends |X|> Class<? extends |X|> where | X | 是调用getClass的表达式的静态类型的擦除。 例如,此代码片段中不需要强制转换:

 Number n = 0; Class<? extends Number> c = n.getClass(); 

因此e.getClass()结果将是Class<? extends Event> Class<? extends Event>这正是Set<Class<? extends Event>> s2 Set<Class<? extends Event>> s2假设存储。 这就是为什么

s2.add(e.getClass());   // OK 

工作正常。


但是在Set<Class<Event>> s情况下,事情会有所不同。 它只能存储Class<Event> 允许它存储Class<? extends Event>对象 Class<? extends Event>引用在类型安全性方面会非常危险。

看看这个例子(为了便于理解,可以代替ClassList和我们的Action实例将Animal就像DogCat )。

List<Dog> dogs = new ArrayList<>(); 
List<? extends Animal> generalList = dogs;

Set<List<Animal>> set = new HashSet<>();

现在假设Set<List<Animal>> set可以存储List<? extends Animal> List<? extends Animal>

set.add(generalList);

现在我们可以做一些可怕的事了

for (List<Animal> animalList : set){
    animalList.add(new Cat()); // I just placed Cat in container full of Dogs!
}

记住我们的List<Dog> dogs = new ArrayList<>(); 清单? 现在它包含Cat ,如果我这样做:

for (Dog dog : dogs){
    dog.speak();
}

我可能会看到类似的东西

WOF


喵! (psst:让我离开这里!)
...

或者代替Meow! NoSuchMethodException或者很可能是ClassCastException: Cat cannot be cast to Dog

所以当你看到允许这种机制不是很明智。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM