2015-04-22 43 views
2

爲什麼這不被允許?錯誤無法調用類型爲'Box <T>'的郵件服務器'

class Box<T>{ 
    let value: T 
    init(_ value:T){ 
     self.value = value 
    } 

    func map<U>(f: T -> U)->Box<U>{ 
     return Box(f(self.value)) 
    } 
} 

錯誤在return Box(f(self.value))

錯誤:無法調用類型的initilizer '框<牛逼>' 類型的參數列表 '(U)'

回答

2

你必須指定要返回的Box對象的類型:

class Box<T> { 
    let value: T 
    init(_ value:T){ 
     self.value = value 
    } 

    func map<U>(f: (T) -> (U)) -> Box<U> { 
     return Box<U>(f(self.value)) 
    } 
} 

Box<T>類實現的上下文中,對Box的任何引用都假定爲Box<T>,除非您明確指定類型(如我在Box<U>return語句中所做的那樣)。

+0

不應該編譯器能夠從上下文中推斷出來嗎? - 但是同樣的事情發生在這裏:http://stackoverflow.com/questions/29107928/swift-map-extension-for-set。 –

+0

是的。我的意思是:這應該被視爲編譯器錯誤嗎? –

+0

@MartinR我會說是,因爲'let val:Int = 1;讓foo = Box(val)'不會給出錯誤,但解決方法是微不足道的。 – JeremyP

相關問題