scala: przekazać null do generyka

scala: przekazać null do generyka
Julian_
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1703
0

To działa:

Kopiuj
class Manager[A, B](produce: A => B) {

  def produce(): B = {
    this.produce(null)
  }

  def produce(r: Response): B = {
    produce()
  }
}

ale to już nie:

Kopiuj
class Manager[A, B](produce: A => B) {

  def produce(): B = {
    this.produce(null)
  }

  def produce(r: A): B = {
    produce()
  }
}

podkreśla this.produce(null)

Cannot resolve overloaded method 'produce'

da się to jakoś sprytniej załatwić niż Optionalem tak jak polecają na Stackoverflow?

DQ
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 141
1

Czemu chcesz tam wstawiać nulla? Nie rób tak w Scali, udawaj, że null w ogóle nie istnieje

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
0

Zamiast Manager[A, B] możesz dać Manager[A >: Null, B] ale potem i tak jest ambiguity error. Ja bym przerobił kod na jakiś bardziej normalny. W kodzie produkcyjnym w Scali się nulli nie używa (no chyba, że się dostaje z zewnątrz, np z jakiegoś Javowego API, ale wtedy się je jak najszybciej przerabia na Optiony).

Julian_
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1703
0

Chdodzi o to, że ScrapperManager opakowuje Scrapper. Mam różne Scrapper. Standardowo Scrapper.produce() to funkcja 1 argumentowa: Request => Response, ale niektóre Scrapper niepotrzebują Request i są funkcjami 0 argumentowymi: Unit => Response.

Wibowit
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: XML Hills
0

Jeśli masz taką dziwną konstrukcję która oczekuje wartości typu Unit to możesz ją podać:

Kopiuj
val fn: Unit => Int = _ => 5

fn(())

Nie trzeba używać nulla.

Unit => Int to nie jest funkcja 0-argumentowa. () => Int to funkcja 0-argumentowa.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.