[英]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>
引用在類型安全性方面會非常危險。
看看這個例子(為了便於理解,可以代替Class
與List
和我們的Action
實例將Animal
就像Dog
和Cat
)。
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.