Questionable compilation failure
Remi Forax
forax at univ-mlv.fr
Thu Sep 19 15:51:44 PDT 2013
On 09/20/2013 12:11 AM, Peter Levart wrote:
>
> On 09/18/2013 06:34 PM, Remi Forax wrote:
>> On 09/18/2013 06:18 PM, Millies, Sebastian wrote:
>>> Hello there,
>>>
>>> on my Windows 7 (64bit) box, the following does not compile with the developer preview build (b 106). Should it?
>>>
>>> import java.util.function.Supplier;
>>>
>>> public class SupplierTest {
>>>
>>> class Concrete<T> implements Supplier<Concrete<T>> {
>>> @Override
>>> public Concrete<T> get() {
>>> return this;
>>> }
>>> }
>>>
>>> interface Test {
>>> default void doSomething() {
>>> new Concrete<String>(); // <-----
>>> }
>>> }
>>>
>>> }
>>>
>>> The error message is:
>>>
>>> \SupplierTest.java:16: error: non-static variable this cannot be referenced from a static context
>>> new Concrete<String>();
>>> ^
>>>
>>> However, a default method implementation is not static, or is it? (Perhaps it's just the error
>>> message that's confusing me.)
>> It's maybe a bug, at least the error message is misleading.
>
Hi Peter,
> I think it's not a bug, but a consequence of the fact that nested
> interfaces are by default static.
no, it's not.
>
> public class SupplierTest {
> interface Test {
> ...
>
> actually means:
>
> public class SupplierTest {
> static interface Test {
>
An interface inside a class is always a static inner interface,
but that's not the point here, Test is static with respect to
SupplierTest but inside Test you can still have instance method (here a
default method) that access to this.
By example, this compiles :
interface Foo {
class A {
void m() {
System.out.println(this);
}
}
}
even if A is implicitly static.
>
> It can't be any other way, since interfaces don't have state.
First you don't need to have state to access to this, you can have
object without state that have methods.
Moreover, even if interfaces don't have state but you can have access to
'this' inside an instance method (a default method) of an interface
because when you call the instance method, yu know that there is an
instance of a class that implement that interface.
> Non-static nested (inner) classes always have implicit state - the
> captured reference to outer instance.
>
>
> Regards, Peter
And to come back to the error message, Eclipse error message is more clear:
"No enclosing instance of type SupplierTest is accessible. Must qualify
the allocation with an enclosing instance of type SupplierTest (e.g.
x.new A() where x is an instance of SupplierTest)."
cheers,
Rémi
More information about the lambda-dev
mailing list