2014-12-02 224 views
0

我有下面的代碼片段,它返回一個類型不匹配錯誤:的Java擴展類類型

@SuppressWarnings("rawtypes") 
public Map<String, Class<? extends SomeClass.SuperClass>> subClass() { 
    return Collections.singletonMap("hello", SomeClass.SubClass.class); 
} 

類聲明如下所示:

public class SomeClass { 

    public static abstract class SuperClass { } 

    public static class SubClass extends SuperClass{ } 
} 

這將返回一個類型不匹配錯誤,說明:

Type mismatch: cannot convert from Map<String,Class<SubClass>> to Map<String,Class<? extends SuperClass>> 

爲什麼會發生這種情況?無論我在subClass()的參數化返回類型中使用「?extends SuperClass」還是隻使用「SuperClass」,我仍然會看到相同的錯誤。我也嘗試過只是擴展SomeClass,但也沒有奏效。

回答

2

您的​​是SuperClass的子類型,但Map<String, Class<SubClass>>不是Map<String, Class<SuperClass>>的子類型。欲瞭解更多信息,你可以看到Generics, Inheritance, and Subtypes

對於Java SE 7,你可以使用:

return Collections.<String, Class<? extends SomeClass.SuperClass>>singletonMap("hello", SomeClass.SubClass.class); 
+0

顯式類型參數是一個很好的觀點,Java 8可以自動調用它嗎? – 2014-12-02 20:11:37

+0

這是[Type inference](https://docs.oracle.com/javase/tutorial/java/generics/genTypeInference.html)和[Target Typing](目標打字)(http://docs.oracle.com/javase/tutorial/) java/javaOO/lambdaexpressions.html#target-typing)東西。 – 2014-12-02 20:26:06

2

我覺得有一個錯字。它應該是:

@SuppressWarnings("rawtypes") 
    public Map<String, Class<? extends SomeClass.SuperClass>> subClass() { 
     return Collections.singletonMap("hello", SomeClass.SubClass.class); 
    } 

你錯過了.class :)


在Java中,泛型是不變的。這意味着,如果:

Dog延伸Animal然後List<Dog>擴展List<Animal>

List<Animal> ls = new ArrayList<Dog>() //illegal 

因此,這是無效的代碼並不起作用:

Map<String, Class<SomeClass.SuperClass>> hello2 = Collections.singletonMap("hello", SomeClass.SubClass.class); 

這是完全沒有問題:

Map<String, Class<? extends SomeClass.SuperClass>> hello = Collections.singletonMap("hello", SomeClass.SubClass.class); 
return hello; 
+0

這仍然給出了類型不匹配的錯誤在Netbeans的。 – 2014-12-02 19:11:18

+0

我正在使用Java8。它對我的編譯很好。 – Jatin 2014-12-02 19:12:00

+0

我有Java 7(1.7.0_67) – 2014-12-02 19:16:07