2012-03-07 10 views
14

Ho due oggetti, ObjectA e ObjectB, entrambi con un metodo update(). Voglio scrivere una funzione che accetta sia ObjectA o ObjectB (ma nessun altro tipo). Concettualmente, questo è quello che sto cercando di fare:accetta più tipi per un parametro in scala

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

Mi rendo conto che ci sono altri modi per risolvere questo problema (ad esempio, la tipizzazione strutturale del metodo update(), classe base comune, ecc), ma la mia domanda è è possibile farlo in questo modo in Scala e, in tal caso, qual è la sintassi? E come si chiama?

+0

Come ci si aspetterebbe a questo lavoro? Come potrebbe il compilatore sapere quali metodi 'T' ha se non sapesse di che tipo fosse? Se intendi assicurarti che la tua classe abbia un 'update', allora è a questo che servono i tipi strutturali. – dhg

+4

possibile duplicato di [Ha Scala tipo "disgiunzione" (tipi di unione)?] (Http://stackoverflow.com/questions/3508077/does-scala-have-type-disjunction-union-types). Sia la risposta accettata che il successivo riferimento più elevato che la mia codifica unione unboxed risolve direttamente questa domanda. –

+0

@dhg, se sia ObjectA che ObjectB hanno un metodo update() e il tipo T estende l'una o l'altra di quelle classi, potrebbe sapere che il tipo T ha un metodo update(). –

risposta

15

In Scala, c'è il tipo O per creare un'unione disgiunta. In sostanza, si farà qualcosa di simile:

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

Checkout http://www.scala-lang.org/api/current/scala/Either.html

+1

Se si desidera trattarli come uno, si potrebbe inoltre utilizzare un tipo strutturale: 'obj.fold [{def update: Unit}] (identità, identità) .update' –

+1

Non ho idea di dove fa o fb provenisse da il tuo esempio o il motivo per cui stai chiamando fold() su obj, ma O sembra essere il modo più vicino e più pulito per farlo. Grazie. –

+0

@Bigwheels sarebbe intersecare per conoscere il contesto del tuo problema, perché potrei sbagliarmi, ma in realtà non ha senso applicare la stessa funzione ai due possibili oggetti di un'unione. Fondamentalmente, fa e fb sono chiusure che si applicano su un ObjectA o un ObjectB. Non li ho definiti nel mio esempio. Dovresti controllare Miles Sabin commentando la tua domanda sui sindacati senza Either, è comunque un tipo di hacking piuttosto tecnico. – blouerat

Problemi correlati