2012-03-07 16 views
14

Mam dwa obiekty, ObjectA i ObjectB, oba z aktualizacją metody(). Chcę napisać funkcję, która akceptuje ObjectA lub ObjectB (ale nie ma innych typów). Koncepcyjnie, to jest to, co próbuję zrobić:akceptuje wiele typów dla parametru w scala

def doSomething[T <: ObjectA | T <: ObjectB](obj: T) = { 
    obj.update 
} 

ja sobie sprawę, że istnieją inne sposoby rozwiązania tego problemu (np typowania strukturalne metody update(), wspólne klasę bazową, etc), ale moje pytanie brzmi: można to zrobić w ten sposób w Scali, a jeśli tak, to jaka jest składnia? I jak to się nazywa?

+0

Jak można się spodziewać to zadziałało? W jaki sposób kompilator wiedziałby, jakie metody miał "T", gdyby nie wiedział, jaki to był typ? Jeśli chcesz upewnić się, że twoja klasa ma "aktualizację", to właśnie do tego służą typy strukturalne. – dhg

+4

możliwy duplikat [Czy Scala ma "typ disjunction" (typy związków)?] (Http://stackoverflow.com/questions/3508077/does-scala-have-type-disjunction-union-types). Zarówno przyjęta odpowiedź, jak i kolejna wysoko oceniona, odnoszące się do mojego kodowania unboxed union, bezpośrednio rozwiązują to pytanie. –

+0

@dhg, jeśli zarówno ObjectA, jak i ObjectB posiadają aktualizację metody(), a typ T rozszerza jedną lub drugą z tych klas, może wiedzieć, że typ T ma metodę update(). –

Odpowiedz

15

W Scali istnieje typ Aby utworzyć rozłączny związek. Zasadniczo, można zrobić coś takiego:

def doSomething(obj: Either[ObjectA, ObjectB]) { 
    obj.fold(fa, fb) 
} 

Zamówienie http://www.scala-lang.org/api/current/scala/Either.html

+1

Jeśli chcesz traktować je jako jeden, możesz również użyć typu strukturalnego: obj.fold [{def update: Unit}] (tożsamość, tożsamość) .update' –

+1

Nie mam pojęcia, skąd pochodzi fa lub fb Twój przykład lub dlaczego wywołujesz fold() na obiekcie, ale wydaje się, że jest to najbliższy, najczystszy sposób, aby to zrobić. Dzięki. –

+0

@Bigwheels byłoby skrzyżowanie znać kontekst swojego problemu, ponieważ mogę być w błędzie, ale tak naprawdę nie czuje się stosować tej samej funkcji do dwóch możliwych obiektów związku. Zasadniczo, fa i fb są zamknięciami stosowanymi w ObjectA lub ObjectB. Nie zdefiniowałem ich w moim przykładzie. Powinieneś sprawdzić komentarz Milesa Sabina odnośnie twojego pytania na temat związków bez tego, ale jest to dość techniczny hakowanie typu. – blouerat

Powiązane problemy