<div class="markdown">
<p dir="auto">Vicente,</p>

<p dir="auto">Thanks for the follow up - I was meaning to chase this up myself.</p>

<p dir="auto">I tried my existing project with the latest TIP builds of JDK8 and the problem still occurs, however using your updated test case I still can&#39;t reproduce it.</p>

<p dir="auto">I suspect you&#39;ve not actually tried to run the maven based project I provided ( understandable as that&#39;s quite heavy weight if you&#39;ve not got an install ), so I&#39;ve simplified my test case repo down to a Makefile and the fest.jar I&#39;ve been using:</p>

<p dir="auto"><a href="https://github.com/talios/jdk8-covariantfail/archive/master.zip">https://github.com/talios/jdk8-covariantfail/archive/master.zip</a></p>

<p dir="auto">Under JDK7 this yields:</p>

<pre><code>bash-4.2$ java -version
java version &quot;1.7.0_40&quot;
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) 64-Bit Server VM (build 24.0-b56, mixed mode)
bash-4.2$ make clean classes
rm -f *.class
javac -g -cp fest-assert-core-2.0M10.jar AppTest.java
Note: AppTest.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
</code></pre>

<p dir="auto">whilst under OpenJDK8:</p>

<pre><code>bash-4.2$ JAVA_HOME=/Users/amrk/Applications/j2sdk-image java -version
openjdk version &quot;1.8.0-jdk8-b108&quot;
OpenJDK Runtime Environment (build 1.8.0-jdk8-b108-20130923)
OpenJDK 64-Bit Server VM (build 25.0-b50, mixed mode)
bash-4.2$
bash-4.2$ JAVA_HOME=/Users/amrk/Applications/j2sdk-image make clean classes
rm -f *.class
javac -g -cp fest-assert-core-2.0M10.jar AppTest.java
AppTest.java:50: error: cannot find symbol
                .hasSize(3);
                ^
  symbol:   method hasSize(int)
  location: class AbstractAssert
Note: AppTest.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
1 error
make: *** [AppTest.class] Error 1
</code></pre>

<p dir="auto">Hopefully, with this simplified build you might be able to spot something more usefull?</p>

<p dir="auto">Cheers,<br>
Mark</p>

<p dir="auto">On 2 Nov 2013, at 7:29, Vicente-Arturo Romero-Zaldivar wrote:</p>

<blockquote>
<p dir="auto">Hi Mark,</p>

<p dir="auto">I have been trying to reproduce the issue you reported. I have created a test case that should reproduce the compilation error but I couldn&#39;t. Please see my last comment in [1].</p>

<p dir="auto">I have compiled this test with last version of the compiler from [2], I get warnings but no errors.</p>

<p dir="auto">Maybe you can try to compile the test at [1] with your settings and confirm that you get the same error(s) as before. If you don&#39;t get the same errors could you please check that the test matches the version of fest-assert you are using?</p>

<p dir="auto">I have simplified the hierarchy while keeping the same method definitions, but I have seen that there are several versions of the library around so probably there can possibly be some**mismatches with your current version.</p>

<p dir="auto">Thanks,<br>
Vicente</p>

<p dir="auto">[1] <a href="https://bugs.openjdk.java.net/browse/JDK-8026329">https://bugs.openjdk.java.net/browse/JDK-8026329</a><br>
[2] <a href="http://hg.openjdk.java.net/jdk8/tl/langtools/">http://hg.openjdk.java.net/jdk8/tl/langtools/</a></p>

<p dir="auto">On 05/10/13 22:15, Mark Derricutt wrote:</p>

<blockquote>
<p dir="auto">Just following up on this now that Java One is over and hopefully more eyes can help me track down just what&#39;s going on here.</p>

<p dir="auto">Try as a may I&#39;ve not yet been able to distil this problem down to a single class file to reproduce, but the extracted project on github ( <a href="https://github.com/talios/jdk8-covariantfail">https://github.com/talios/jdk8-covariantfail</a> ) continues to fail under JDK8.</p>

<p dir="auto">The FEST-Assert library uses a fairly complex class hierarchy, employing some gnarly &quot;self type&quot; generics in order to provide the appropriate type to javac.</p>

<p dir="auto">When compiling under Java 7 the project works fine, but when compiling under JDK8 ( developer preview, and also  HEAD/master builds from mercurial ) fail to compile the 2nd test function, as the inferred return type is getting lost somewhere along the way.</p>

<p dir="auto">If the 2nd test is broken up with intermediate variables then the call to hasSize(3) on line 37 compiles fine.</p>

<p dir="auto">Given this works under Java 7, and fails under Java 8 - this is clearly some form of regression/bug somewhere,<br>
just exactly what is broken, and how to reproduce it is so far eluding me, any help in isolating this issue so that a relevant bug can be raised, tracked, and fixed would be helpful.</p>

<p dir="auto">Mark</p>

<p dir="auto">--<br>
Mark Derricutt <a href="mailto:mark@talios.com">mark@talios.com</a> — twitter <a href="https://twitter.com/talios">https://twitter.com/talios</a> — podcast <a href="http://www.illegalargument.com">http://www.illegalargument.com</a> — blog <a href="http://www.theoryinpractice.net">http://www.theoryinpractice.net</a> — google+ <a href="http://gplus.to/talios">http://gplus.to/talios</a></p>

<p dir="auto">On 23/09/2013, at 5:30 PM, Mark Derricutt &gt; wrote:</p>

<blockquote>
<p dir="auto">Hi all,</p>

<p dir="auto">Since you&#39;re all enjoying JavaOne at the moment I was thinking it was about time that I starting building $work&#39;s project under JDK8 and give it some love over my normal small projects and ran into an odd issue with generics/covariant returns that works fine under 7u40 and breaks under 8DP.</p>

<p dir="auto">I&#39;ve extracted this into a simple project [1] which I&#39;ve pushed to github, I&#39;ve added a comment on the code that breaks under JDK8.</p>

<p dir="auto">The code in question is:</p>

<p dir="auto">List strings…</p>

<p dir="auto">assertThat(strings).describedAs(&quot;test&quot;)<br>
.isNotEmpty()<br>
.has(regexMatch(&quot;th.<em>&quot;))<br>
.doesNotHave(regexMatch(&quot;moo.</em>&quot;))<br>
.hasSize(3);</p>

<p dir="auto">When calling assertThat(strings) a class of type ListAssertion is returned, and passed along the call chain.</p>

<p dir="auto">The problem appears to be that when doesNotHave() returns, javac no longer sees a ListAssertion but rather a top level AbstractAssertion on which doesNotHave is defined:</p>

<p dir="auto">/** {@inheritDoc} */<br>
public S has(Condition&lt;? super A&gt; condition) {<br>
conditions.assertHas(info, actual, condition);<br>
return myself;<br>
}</p>

<p dir="auto">/** {@inheritDoc} */<br>
public S doesNotHave(Condition&lt;? super A&gt; condition) {<br>
conditions.assertDoesNotHave(info, actual, condition);<br>
return myself;<br>
}</p>

<p dir="auto">Now, both has() and doesNotHave() appear to have the exact same signature, yet commenting out the call to doesNotHave() doesn&#39;t appear to trigger what appears to be a down casting to AbstractAssertion which doesn&#39;t include a method called hasSize(), the output I see from javac is:</p>

<p dir="auto">~/D/covariantfail (master|…) $ /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/bin/java -version<br>
java version &quot;1.8.0-ea&quot;<br>
Java(TM) SE Runtime Environment (build 1.8.0-ea-b106)<br>
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b48, mixed mode)</p>

<p dir="auto">~/D/covariantfail (master|…) $ /Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/bin/javac -version<br>
javac 1.8.0-ea</p>

<p dir="auto">/Library/Java/JavaVirtualMachines/jdk1.8.0.jdk/Contents/Home/bin/javac -d /Users/amrk/Dropbox/covariantfail/target/test-classes -classpath /Users/amrk/Dropbox/covariantfail/target/test-classes:/Users/amrk/Dropbox/covariantfail/target/classes:/Users/amrk/.m2/repository/org/testng/testng/6.8.5/testng-6.8.5.jar:/Users/amrk/.m2/repository/junit/junit/4.10/junit-4.10.jar:/Users/amrk/.m2/repository/org/hamcrest/hamcrest-core/1.1/hamcrest-core-1.1.jar:/Users/amrk/.m2/repository/org/beanshell/bsh/2.0b4/bsh-2.0b4.jar:/Users/amrk/.m2/repository/com/beust/jcommander/1.27/jcommander-1.27.jar:/Users/amrk/.m2/repository/org/yaml/snakeyaml/1.6/snakeyaml-1.6.jar:/Users/amrk/.m2/repository/org/easytesting/fest-assert-core/2.0M10/fest-assert-core-2.0M10.jar:/Users/amrk/.m2/repository/org/easytesting/fest-util/1.2.5/fest-util-1.2.5.jar: -sourcepath /Users/amrk/Dropbox/covariantfail/src/test/java: /Users/amrk/Dropbox/covariantfail/src/test/java/com/talios/RegexMatch.java /Users/amrk/Dropbox/covariantfail/src/test/java/com/talios/AppTest.java -g -nowarn -target 1.5 -source 1.5 -encoding UTF-8<br>
/Users/amrk/Dropbox/covariantfail/src/test/java/com/talios/AppTest.java:37: error: cannot find symbol<br>
            .hasSize(3);<br>
            ^<br>
symbol:   method hasSize(int)<br>
location: class AbstractAssert<br>
Note: /Users/amrk/Dropbox/covariantfail/src/test/java/com/talios/AppTest.java uses unchecked or unsafe operations.<br>
Note: Recompile with -Xlint:unchecked for details.<br>
1 error</p>

<p dir="auto">Is this a known bug in the JDK at all? I&#39;m quite surprised no one else has hit something like this before if its not?</p>

<p dir="auto">[1] <a href="https://github.com/talios/jdk8-covariantfail">https://github.com/talios/jdk8-covariantfail</a><br>
[2] <a href="https://github.com/talios/jdk8-covariantfail/commit/faa016e57f754230da46e3453b964d497ec065b5#commitcomment-4151896">https://github.com/talios/jdk8-covariantfail/commit/faa016e57f754230da46e3453b964d497ec065b5#commitcomment-4151896</a></p>

<p dir="auto">-- Mark Derricutt ( <a href="mailto:mark@talios.com">mark@talios.com</a> <a href="mailto:mark@talios.com">mark@talios.com</a> )<br>
— twitter: <a href="https://twitter.com/talios">https://twitter.com/talios</a><br>
— podcast: <a href="http://www.illegalargument.com">http://www.illegalargument.com</a> <a href="http://www.illegalargument.com/">http://www.illegalargument.com/</a><br>
— blog: <a href="http://www.theoryinpractice.net">http://www.theoryinpractice.net</a> <a href="http://www.theoryinpractice.net/">http://www.theoryinpractice.net/</a><br>
— google+: <a href="http://gplus.to/talios">http://gplus.to/talios</a></p>
</blockquote>
</blockquote>
</blockquote>

</div>