Ответ 1
Если бы вы просто бросили Subject на Observable вы все равно могли бы использовать его как Subject, отбросив его:
PublishSubject<String> subject = PublishSubject.create();
subject.subscribe(System.out::println);
Observable<String> observable = subject;
((PublishSubject<String>) observable).onNext("Hello, world!");
Observable.asObservable() фактически не передает тип Observable; он фактически обертывает текущий Observable. Это означает, что никто не имеет доступа к Observable вверх.
Тот же код, использующий asObservable() сбой ClassCastException:
PublishSubject<String> subject = PublishSubject.create();
subject.subscribe(System.out::println);
Observable<String> observable = subject.asObservable();
((PublishSubject<String>) observable).onNext("Hello, world!");
Это очень похоже на final модификатор. Иногда вы не хотите, чтобы код имел 100% контроль над всем.