2015-02-27 4 views
0

Учитывая следующее в Java:Как я могу создать подтип `I`, который бы обернул другие подтипы` I`?

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.

ответ

2

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

class PassthroughReply[T](val reply: Reply[T]) extends Reply[T] { 
    override def data = reply.data 
} 
+0

Если я это сделаю, мне нужно будет передать тип, используемый StatusReply, например. 'new PassthroughReply [String] (новый StatusReply (« OK »)). Я хочу, чтобы PassthroughReply мог просто вывести тип, используемый StatusReply автоматически. –

+1

Тип PassthroughReply может быть выведен из параметров, которые вы используете для его построения. Попробуйте новый PassthroughReply (новый StatusReply («ОК»)) – Upio

+0

Это действительно сработало! Спасибо! –