2013-06-12 56 views
0

裏面我不知道爲什麼下面的一般定義不會產生編譯器警告:原始類型的一般定義

class MyClass<T extends List> { } 

和上面的定義是如何

class MyClass<T extends List<?>> { } 

不同每當你瞭解泛型,您會了解應該如何避免原始類型,因此,無論何時處理泛型類型,都會收到編譯器警告。然而,第一個定義中的原始類型不會產生這樣的警告。

其次,我不知道原始類型和泛型之間的確切的子類型定義是如何的。根據this summary,原始類型是類型檢查的「退出」類型,因此只要涉及原始類型,類型檢查就無效。這個假設是否正確?這是如何影響上述「原始」通用定義的?

謝謝你的幫助!

UPDATE:我明白你在說什麼。但是,這並不是我所困惑的。看着這樣的場景:

class MyClass<T extends MyClass<T>> {} 

public void callWildcard1(MyClass<?> node) { 
    callBound1(node); 
} 

public <T extends MyClass<T>> void callBound1(T node) { 
    // Do something 
} 

public void callWildcard2(MyClass<?> node) { 
    callBound2(node); 
} 

public <T extends MyClass> void callBound2(T node) { 
    // Do something 
} 

callWildcard1callBound1第一個電話是不允許的,因爲一般的約束。然而第二個是允許的。如何在沒有「內部原始類型」的情況下執行第一次調用?我不明白爲什麼編譯器會禁止第一個。沒有任何參數有效的通配符參數暗示? extends MyClass<?>

更新2:我發現通過試錯,我可以通過定義解決的問題:

public <T extends MyClass<? extends T> void callBound2(T node) { 
    // Do something 
} 

即使我不明白爲什麼。但是,還有更多的困惑,在這個例子看時:(這是什麼其實我試圖做一個非常簡單的版本)

public void call() { 
    genericCall1(new MyFilter<MyClass<?>>(), MyClass.class); 
    genericCall2(new MyFilter<MyClass<?>>(), MyClass.class); 
} 

public <T extends MyClass<? extends T>> void genericCall1(MyFilter<T> filter, Class<? extends T> filterBoundary) { 
    // Do something. 
} 

public <T extends MyClass<? extends T>, U extends T> void genericCall2(MyFilter<T> filter, Class<? extends U> filterBoundary) { 
    // Do something. 
} 

class MyClass<T extends MyClass<T>> { } 

class MyFilter<T extends MyClass<? extends T>> { } 

爲什麼genericCall1禁止genericCall2是不是?再次,我通過學術猜測找到了解決方案,而不是真正的理解。有時,在使用Java及其泛型時,我想哭...

+0

我一個讓華林「List是原始類型引用泛型類型列表應該是參數化。」與JDK 1.6 – sanbhat

+0

在第一'MyClass'定義您提供這樣一種類型,是'List',這就是爲什麼你沒有得到警告。 – Sam

回答

2

不同之處在於,當您在MyClass中使用class MyClass<T extends List> { }時,您將失去類型安全性。

例如:

class A <T extends List<?>>{ 
    void someFunc(T t) { 
     t.add(new Object());//compilation error 
    } 

} 

class B <T extends List>{ 
    void someFunc(T t) { 
     //compiles fine 
     t.add(new Object()); 
     t.add("string"); 
     t.add(new Integer(3)); 
    } 
} 
+0

我想這基本上是我的問題的答案。我用另一個問題來提煉我的實際意圖。 http://stackoverflow.com/questions/17061292/java-generics-raw-types-inside-of-generic-definition –