2014-10-04 149 views
0

我試圖重寫調用超類的方法,並將返回的值添加到新集合(因爲超類的返回值是不可變的,所以這是必需的)。如何將一個集合的內容添加到新集合

慣用的Java這個如下:

public class JaxrsApplication extends Application { 

    @Override public Set<Class<?>> getClasses() { 
     HashSet<Class<?>> classes = new HashSet<>(super.getClasses()); 
     classes.add(PlainTextWriter.class); 
     classes.add(PageResource.class); 
     return classes; 
    } 
} 

我試圖實現科特林沒有成功等價物:

public class JaxrsApplication() : Application() { 

    override fun getClasses(): MutableSet<Class<out Any?>>? { 
     val classes = hashSetOf<Class<out Any?>>() 
     classes.addAll(super.getClasses())   // <= compiler error! 
     classes.add(javaClass<PlainTextWriter>()) 
     classes.add(javaClass<PageResource>()) 
     return classes 
    } 

} 

這似乎是在一個類型推斷問題addAll函數,但我不知道如何解決它。幫助表示讚賞:-)


對於未來的讀者,我在這裏混淆的原因是由於錯誤彈出的類型不匹配:

error pop-up

MutableSet實現Iterable,這裏的關鍵是最後的'?' 'Found'行中的字符表示返回的值是可空的。

回答

1

您收到編譯器錯誤,因爲super.getClasses返回nullable類型,但addAll只接受not-null參數。

有可能與if-statement!!運營商解決這個問題:

1.

val superClasses = super.getClasses() 
if (superClasses != null) { 
    classes.addAll(superClasses) 
} 

2.

classes.addAll(super.getClasses()!!) 
0

在科特林M9你不應該有這個問題了。它具有不同類型系統的概念,或者說Java和JavaScript平臺類型與Kotlin類型不同而且鬆散的「平臺類型」。因此,您可以在不允許更具體的Kotlin類型的地方使用可能爲null的Java平臺類型。例如,Java方法返回一個可能爲空的值,那麼推斷的類型將是Java平臺類型,並且您可以將其傳遞給其他空白檢查被禁用的東西,因爲它對於Java而言是未知的。如果你沒有使用類型推斷專門給它一個Kotlin類型,那麼你就會強制它進入更嚴格的空檢查,並且在那行代碼中Kotlin會斷言這個值對你而言不是空的(與以前使用的一樣!) 。

所以在M9中,你有兩個選擇。讓Java類型丟失並導致可能的問題。或者告訴Kotlin您希望將它專門視爲可爲空或不爲空,或者使用舊的!斷言。

相關問題