Как я могу создать подтип «я», который будет обертывать другие подтипы «я»?

Учитывая следующее в Java:

public interface Reply<T> {
  T data();
}

public class StatusReply implements Reply<String> {
  private final String status;

  public StatusReply(String status) {
    this.status = status;
  }

  @Override
  public String data() {
    return status;
  }
}

Я хочу иметь возможность сделать это в Scala:

class PassthroughReply[R <: Reply[_]](val reply: R)
  extends Reply[T] { // won't compile, `T` type not found

    override
    def data[T : Reply]: T = reply.data
}

val statusReply = new StatusReply("OK")
val passthroughReply = new PassthroughReply[SatusReply](statusReply)
passthroughReply.data // Should return "OK"

Я хочу, чтобы data в экземпляре PassthroughReply имел тот же тип, что и data его обернутого подтипа Reply.


person Ramon Marco L. Navarro    schedule 27.02.2015    source источник


Ответы (1)


Как насчет этого?

class PassthroughReply[T](val reply: Reply[T]) extends Reply[T] { 
    override def data = reply.data
}
person Upio    schedule 27.02.2015
comment
Если я это сделаю, мне нужно будет передать тип, используемый StatusReply, например. new PassthroughReply[String](new StatusReply("OK")) Я хочу, чтобы PassthroughReply мог просто автоматически определить тип, используемый StatusReply. - person Ramon Marco L. Navarro; 27.02.2015
comment
Тип PassthroughReply можно определить по параметрам, которые вы используете для его создания. Попробуйте новый PassthroughReply (новый StatusReply (ОК)) - person Upio; 27.02.2015
comment
Извините, но мне нужно иметь возможность ввести проверку с типом Reply, например. PassthroughReply[StatusReply] вместо PassthroughReply[String]. - person Ramon Marco L. Navarro; 27.02.2015