Fwd: Valid java 5 code refuses to compile with lambda-8-b81-linux-x64-12_mar_2013

Sven Reimers sven.reimers at gmail.com
Mon Mar 18 10:54:30 PDT 2013


Is this one similiar?

private void testMethod() {
        XYChart<Number, Number> numberChart = new LineChart<>(new NumberAxis(),
new NumberAxis());
        List<XYChart.Data<Number, Number>> data_1 = new ArrayList<>();
        List<XYChart.Data<Number, Number>> data_2 = new ArrayList<>();
        numberChart.getData().setAll(Arrays.asList(
                        new XYChart.Series<>("Data",
FXCollections.observableList(data_1)),
                        new XYChart.Series<>("Data",
FXCollections.observableList(data_2))));
    }

Thanks

-Sven

P.S. I think it worked in one build (b77?) and stopped working with one of
the next ones...


On Mon, Mar 18, 2013 at 3:06 PM, Maurizio Cimadamore <
maurizio.cimadamore at oracle.com> wrote:

> On 17/03/13 20:39, Grégoire Neuville wrote:
> > Yes, I noticed that (lb.<C>apply(map(f)) also works).
> >   But with a jdk 7 or former, you don't need to explicitly type the
> > expression for it to compile.
> > Looks like a bug or a regression to me : jdk1.8 was intended to provide a
> > (far) better type inference. That's clearly not the case here...
> This is a straight compiler bug - the compiler knows that map.M =
> Func<Bind.B, Bind.C> and M = Func<Bind.B, Apply.B> - so it should derive
> Apply.B = Bind.C; but this derivation step is missing in the compiler
> which ends up inferring Apply.B = Object. This should obviously be fixed.
>
> Maurizio
> >
> >
> > On 17 March 2013 20:14, Sam Pullara <sam at sampullara.com> wrote:
> >
> >> Looks like the confusion is in type inference. If you have an explicit
> >> type it does work:
> >>
> >>          <B, C> List<C> bind(final List<B> lb, final Func<A, Func<B,
> C>> f)
> >> {
> >>              List<Func<B, C>> map = map(f);
> >>              return lb.apply(map);
> >>          }
> >>
> >> Sam
> >>
> >> On Sat, Mar 16, 2013 at 4:17 PM, Grégoire Neuville
> >> <gregoire.neuville at gmail.com> wrote:
> >>> Hello,
> >>>
> >>> First of all, let me thank and congratulate you for the hard work
> you're
> >>> putting into adding a functional tone to java : this is a great move
> that
> >>> will undoubtedly prove itself immensely beneficial.
> >>>
> >>> That being said, I'm having a hard time compiling some basic java 5
> code
> >>> with the binary pre-release of both the bare jdk 1.8 and the
> >>> lambda-enriched one. Indeed, trying to compile the below code :
> >>>
> >>> <code>
> >>>
> >>>   public class TestJ8 {
> >>>
> >>>      interface Func<A, B> {
> >>>          B f(A a);
> >>>      }
> >>>
> >>>      class List<A> {
> >>>
> >>>          <B> List<B> map(Func<A, B> f) {
> >>>              return null;
> >>>          }
> >>>
> >>>          <B> List<B> bind(Func<A, List<B>> f) {
> >>>              return null;
> >>>          }
> >>>
> >>>          <B> List<B> apply(final List<Func<A, B>> lf) {
> >>>              return lf.bind(this::map);
> >>>          }
> >>>
> >>>          <B, C> List<C> bind(final List<B> lb, final Func<A, Func<B,
> C>>
> >> f) {
> >>>              return lb.apply(map(f)); // fails to compile
> >>>          }
> >>>
> >>>      }
> >>>
> >>> }
> >>>
> >>> </code>
> >>>
> >>> fails with the given message :  error: method apply in class
> >> TestJ8.List<A>
> >>> cannot be applied to given types
> >>>
> >>> Is it expected behaviour or am I missing something (installation steps
> or
> >>> whatever...) ?
> >>>
> >>> Note : The compiler is invoked through maven with the following
> >>> configuration :
> >>>
> >>> <plugin>
> >>>              <groupId>org.apache.maven.plugins</groupId>
> >>>              <artifactId>maven-compiler-plugin</artifactId>
> >>>              <version>3.0</version>
> >>>              <configuration>
> >>>                  <verbose>true</verbose>
> >>>                  <fork>true</fork>
> >>>                  <executable>/usr/lib/jvm/java8/bin/javac</executable>
> >>>                  <compilerArgument>-g</compilerArgument>
> >>>                  <compilerVersion>1.8</compilerVersion>
> >>>                  <source>1.8</source>
> >>>                  <target>1.8</target>
> >>>              </configuration>
> >>> </plugin>
> >>>
> >>> Thanks !
> >>>
> >>> --
> >>> Grégoire Neuville
> >>>
> >
> >
>
>
>


-- 
Sven Reimers

* Senior Expert Software Architect
* NetBeans Dream Team Member: http://dreamteam.netbeans.org
* Community Leader  NetBeans: http://community.java.net/netbeans
                              Desktop Java:
http://community.java.net/javadesktop
* Duke's Choice Award Winner 2009
* Blog: http://nbguru.blogspot.com

* XING: https://www.xing.com/profile/Sven_Reimers8
* LinkedIn: http://www.linkedin.com/in/svenreimers

Join the NetBeans Groups:
* XING: http://www.xing.com/group-20148.82db20
* NUGM: http://haug-server.dyndns.org/display/NUGM/Home
* LinkedIn: http://www.linkedin.com/groups?gid=1860468
                   http://www.linkedin.com/groups?gid=107402
                   http://www.linkedin.com/groups?gid=1684717
* Oracle: https://mix.oracle.com/groups/18497


More information about the lambda-dev mailing list