裏面我試圖編譯下面的代碼:斯卡拉 - 使用參數化類型參數化類型
case class Settings(settingsList:List[Setting])
abstract class Setting[T](name:String, value:T)
但是編譯器會抱怨:
Error:(9, 54) class Setting takes type parameters
case class Settings(settingsList:List[Setting])
^
,但相應的Java代碼編譯sucesfully:
public class Settings {
List<Setting> settingsList;
}
abstract class Setting<T> {
abstract T getValue();
abstract String getName();
}
斯卡拉有什麼不同,它不會允許這樣的行爲?
與方差混淆不一定是最好的主意。取決於Setting的實現細節,協方差可能沒有意義,並且會限制設計。通配符似乎是要走的路。 –
@UlysseMizrahi它不是「搞亂」。我建議始終在有意義的情況下用差異註釋類型。這就是基於子類型的系統的工作方式,而Scala更喜歡不可變的數據結構,因此這很有意義。在我無法確定的情況下,您可以使用存在(通配符)類型。 –
「這是一個基於子類型的系統工作的方式」 - 這是不正確的,雖然協方差確實與不變性有關,但強制協方差意味着無法在方法參數中使用該類型(即使在不可變結構中也可能需要)。此外,方差在類型設計方面具有實際意義。我們是否需要設置[List [Int]]爲設置[Iterable [Int]]?從設計的角度來看,這可能沒有意義。 –