Próbuję zdefiniować niestandardowy interfejs kolekcji w Scala 2.8. Chcę wymagać, aby podklasy były Traversable, a także inne zachowania. Chcę również podobne metody mapie(), aby przywrócić odpowiedni typ, jak poniżej:Jak zdefiniować niestandardowy interfejs kolekcji w Scali bez definiowania implementacji?
trait CustomCollection[+A] extends Traversable[A] {
def customOperation(i:Int):Int // for example
}
def incrementAll(c:CustomCollection[Int]):CustomCollection[Int] = c.map { _ + 1 }
nie skompilować, ponieważ CustomCollection.map() zwraca przesuwny. Przypuszczam, że muszę zdefiniować CanBuildFrom, ale muszę zdefiniować metodę apply(), która tworzy instancję od zera. Nie chcę określać sposobu konstruowania tego; to powinno należeć do realizatora. czy to możliwe?
Dzięki, axel22. Jeśli rozumiem twoją odpowiedź, muszę podać domyślną implementację CustomCollection, która będzie używana przez metodę newBuilder mojego kompana. Miałem nadzieję uniknąć określenia domyślnej implementacji. Czy mógłbyś wyjaśnić, dlaczego go potrzebuję? Wydaje się, że nie powinno to być konieczne dla metody takiej jak map(), ponieważ nie można wywołać metody map(), chyba że masz już jakieś implementacje. – traversable
Z technicznego punktu widzenia można uniknąć dostarczenia domyślnej implementacji buildera w pakiecie 'CustomCollection', ale w jaki sposób zaimplementować metodę bez parametrów' apply() 'w' CanBuildFrom'? Możesz pozwolić, aby 'newBuilder' w elemencie' CustomCollection' wyświetlał nieobsługiwany wyjątek operacji, co pozwoli uniknąć domyślnej implementacji.Wierzę, że wszystko by wtedy działało, z wyjątkiem metody 'breakOut' w kolekcjach, która wymaga bez parametrycznego' apply() '.. – axel22
Ah ... więc powodem, dla którego potrzebuję domyślnej implementacji, jest wykonanie operacji breakOut. Dzięki! – traversable