I'm not entirely sure that is a problem, have a look at the following:

https://gist.github.com/jedws/5993596#file-variancetest-java

it is only the one with a covariance annotation on the parameter that fails…


On 15 July 2013 12:52, Zhong Yu <zhong.j...@gmail.com> wrote:

> Another example of possible missing a wildcard
>
>
> http://gee.cs.oswego.edu/dl/jsr166/dist/docs/java/util/concurrent/CompletionStage.html#thenCompose%28java.util.function.Function%29
>
>    thenCompose(Function<? super T,? extends CompletionStage<U>> fn)
>
> should be
>
>    thenCompose(Function<? super T,? extends CompletionStage<? extends U>>
> fn)
>
> The problem is probably wide spread, and we need a tool to find these
> mistakes.
>
> Zhong Yu
>
>
> On Sun, Jul 14, 2013 at 8:04 AM, Jed Wesley-Smith <j...@wesleysmith.io>
> wrote:
> > (accidentally didn't post to the list)
> >
> >> You probably know that the example provided is not completed ported to
> > work with our Optional implementation,
> >
> > It should be, for the example I wrote an Optional that is final and
> should
> > be otherwise identical. It should certainly be fairly easy for any
> > committer to try. If you can make it work without the ? extends Optional
> > I'd love an explanation of how.
> >
> >> and fugue works around the type system with Option as abstract class.
> >
> > As I've tried to explain, this isn't about the implementation of the
> > container class, but how covariance works with a parameterised class.
> >
> > We originally had the non-, but in a discussion with Brian he alerted us
> to
> > the fact that the signature was wrong. We hastily fixed it:
> >
> >
> https://bitbucket.org/atlassian/fugue/commits/9eca663326a5baeb8f23974732ec585d5627a05c
> >
> > To further demonstrate, I give you a minimal example of a final Optional
> > implementation that does not compile for this test:
> >
> > https://gist.github.com/jedws/5993596#file-gistfile1-java-L57
> >
> > cheers,
> > jed.
> >
> >
> >
> > On 14 July 2013 15:02, Henry Jen <henry....@oracle.com> wrote:
> >
> >>  I think I understand what you are saying. However, unless we make
> >> Optional not final, the extends part just doesn't matter.
> >>
> >> You probably know that the example provided is not completed ported to
> >> work with our Optional implementation, and fugue works around the type
> >> system with Option as abstract class.
> >>
> >> Cheers,
> >> Henry
> >>
> >>  On Jul 13, 2013, at 4:35 PM, Jed Wesley-Smith <j...@wesleysmith.io><
> j...@wesleysmith.io>wrote:
> >>
> >>  I did supply a test that you can use to try it.
> >>
> >>  What we are talking about is whether type Box<Parent> is substitutable
> >> by Box<Child> in the contravariant position. Intuitively we think we
> only
> >> need Box<? extends Parent> because we only care about the type
> parameter,
> >> but the type – as you point out – is actually different. Box<Parent> is
> not
> >> "inherited by" Box<Child>.
> >>
> >>  Specifically, if we have a consuming Box, and we replace it with a Box
> >> of a more specific type parameter, we could attempt feed the more
> general
> >> type into it, ie. a Box<Child> isn't going to appreciate having Parent
> fed
> >> to it. This is why covariance and mutable containers don't mix well, and
> >> why Java's covariant arrays are problematic.
> >>
> >>  In this situation we have an immutable container, and we can substitute
> >> the type of our container with one of a more specific type, as it will
> only
> >> ever supply a value – and a value of Child will suffice as a Parent. So,
> >> for this case we need a Box that is substitutable, and therefore we
> need to
> >> add the covariance to our box.
> >>
> >>  <? extends Box> is simply adding covariance to our Box type.
> >>
> >>  For a much better explanation than I can give about this, see this
> >> excellent post describing generics in Scala, which – apart from have
> >> declaration-site variance and using [A] in place of <A> – generally
> follow
> >> the same pattern:
> >>
> >>
> >>
> http://termsandtruthconditions.herokuapp.com/blog/2012/12/29/covariance-and-contravariance-in-scala/
> >>
> >>  cheers,
> >> jed.
> >>
> >>
> >> On 14 July 2013 04:49, Henry Jen <henry....@oracle.com> wrote:
> >>
> >>> I think the type you talking about here is Optional<? extends U>
> instead
> >>> of ? extends Optional<U>.
> >>>
> >>>  IIRC, Optional<? extends U> is not a subtype of Optional<U>, just like
> >>> any other Collection class. List<Child> is not a List<Parent>.
> >>>
> >>>  Cheers,
> >>> Henry
> >>>
> >>>
> >>>  On Jul 13, 2013, at 3:15 AM, Jed Wesley-Smith <j...@wesleysmith.io>
> >>> wrote:
> >>>
> >>>  > The ? extends Optional is unnecessary in flatMap as Optional is
> final.
> >>>
> >>>  interestingly enough, it actually is.
> >>>
> >>>  try the following test:
> >>>
> >>>  class OptionalTest {
> >>>   class Parent {};
> >>>
> >>>    class Child extends Parent {};
> >>>
> >>>    @Test public void covariantReturn() {
> >>>     Optional<Parent> some = some(new Parent());
> >>>     Function<Parent, Optional<Child>> f = new Function<Parent,
> >>> Optional<Child>>() {
> >>>       @Override public Optional<Child> apply(Parent p) {
> >>>         return some(new Child());
> >>>       }
> >>>     };
> >>>     Optional<Parent> mapped = some.<Parent> flatMap(f);
> >>>     assertThat(mapped.get(), notNullValue());
> >>>   }
> >>> }
> >>>
> >>>  adapted from the fugue test suite:
> >>>
> >>>
> >>>
> https://bitbucket.org/atlassian/fugue/src/96a65067fb7aaf1edae1bffa07167a5865cbebec/src/test/java/com/atlassian/fugue/OptionTest.java#cl-155
> >>>
> >>>  The point to remember is that Optional<Child> is a type and as such is
> >>> actually a subtype of Optional<Parent> –  and therefore requires a
> >>> covariant return.
> >>>
> >>>  cheers,
> >>> jed.
> >>>
> >>>
> >>>
> >>>
> >>> On 13 July 2013 04:15, Mike Duigou <mike.dui...@oracle.com> wrote:
> >>>
> >>>> The ? extends Optional is unnecessary in flatMap as Optional is final.
> >>>> Otherwise this looks good.
> >>>>
> >>>> Mike
> >>>>
> >>>> On Jul 5 2013, at 14:37 , Henry Jen wrote:
> >>>>
> >>>> > Hi,
> >>>> >
> >>>> > Please review the webrev at
> >>>> >
> >>>> > http://cr.openjdk.java.net/~henryjen/ccc/8015317.0/webrev/
> >>>> >
> >>>> > Which adds following method to Optional,
> >>>> >
> >>>> > public static <T> Optional<T> ofNullable(T value) {}
> >>>> > public Optional<T> filter(Predicate<? super T> predicate) {}
> >>>> > public<U> Optional<U> map(Function<? super T, ? extends U> mapper)
> {}
> >>>> > public<U> Optional<U> flatMap(Function<? super T, ? extends
> >>>> Optional<U>>
> >>>> > mapper) {}
> >>>> >
> >>>> > Also included is some cleanup on javadoc.
> >>>> >
> >>>> > Cheers,
> >>>> > Henry
> >>>>
> >>>>
> >>>>
> >>>
> >>>
> >>
> >>
> >
>

Reply via email to