@rkuhn one problem is that java Consumer/Subscriber is invariant, and therefore this should be `other: Consumer[_ >: T]`

I have been playing around with the following code:

    import org.reactivestreams.api.Consumer
    import org.reactivestreams.spi.Subscriber
    import org.reactivestreams.spi.Subscription
    
    class Foo[+T] {
      def tee(other: Consumer[_ >: T]): Foo[T] = this
      def tee2(other: Subscriber[_ >: T]): Foo[T] = this
    }
    
    class MySubscriber[A] extends Subscriber[A] {
      def onSubscribe(subscription: Subscription): Unit = ???
      def onNext(elem: A): Unit = ???
      def onError(e: Throwable): Unit = ???
      def onComplete(): Unit = ???
    }
    
    object Use {
      val foo = new Foo[Apple]
      val c = new Consumer[Fruit] {
        def getSubscriber: Subscriber[Fruit] = ???
      }
      val foo2: Foo[Apple] = foo.tee(c)
    
      val s = new Subscriber[Fruit] {
        def onSubscribe(subscription: Subscription): Unit = ???
        def onNext(elem: Fruit): Unit = ???
        def onError(e: Throwable): Unit = ???
        def onComplete(): Unit = ???
      }
      val foo3: Foo[Apple] = foo.tee2(s)
    
      val s2 = new MySubscriber[Fruit]
      val foo4: Foo[Apple] = foo.tee2(s2)
    }
    
    class Fruit
    class Apple extends Fruit

It's more interesting to make sure Subscriber works, since that will be the new Consumer.

I'm not sure about contra-variant. You mean?
`class MySubscriber[-A] extends Subscriber[A]`
but that doesn't work