簡體   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