Stefan,

I haven't had a chance to reproduce this myself, but it does sound as
if you have something here.

Two questions:

1. What version of GWT are you using when this happens?
2. Would you mind opening an issue in the issue tracker and including
a link to this thread?

Issue tracker: http://code.google.com/p/google-web-toolkit/issues/list

Thanks,
Isaac

On Thu, Oct 30, 2008 at 12:24 PM, Stefan Hübner
<[EMAIL PROTECTED]> wrote:
>
> Hi all,
>
> I encountered some odd behaviour of GWT's compiler regarding generic
> interfaces and abstract implementations. I had compiled
> JavaScript-code failing with
>   "com.google.gwt.core.client.JavaScriptException: (TypeError):
> foo.set is not a function"
>
> It took a while to hunt the problem down. This mail is to warn you
> about the found issue and to provide a workaround. Maybe the
> developers find this worth to be fixed?
>
> In short, suppose you had the following interface and its implementation:
>
>        interface Foo<T> {
>                T get();
>                void set( T v );
>        }
>
>        abstract class AbstractFoo {
>                String v;
>                public String get() { return v; }
>                public void set(String v) { this.v = v; }
>        }
>
>        class MyFoo extends AbstractFoo implements Foo<String> {}
>
>
> Then, the following code will fail in web mode:
>
>                Foo<String> foo = new MyFoo();
>                foo.set( "bar" ); // FAILS
>
> foo.set(...) will fail with
> "com.google.gwt.core.client.JavaScriptException: (TypeError): foo.set
> is not a function". But *only in web* mode though - in hosted mode the
> code runs fine.
>
> I was able to figure out the problematic scenario:
> - you have a generic interface
> - you have an abstract implementing the interface's methods WITHOUT
> implementing the interface itself (no "implements" statement)
> - you have a concret class extending the abstract one. this class now
> features an "implements" statement to implement the generic interface
>
> This scenario might seem slightly constructed, but in my project we
> had code looking just like that. The Java-Compiler didn't complain,
> neither did GWT's compiler. So the code is valid Java.
>
> To circumvent this error, the following does work:
>
>        abstract class AbstractFoo  implements Foo<String>  {
>                String v;
>                public String get() { return v; }
>                public void set(String v) { this.v = v; }
>        }
>        class MyFoo extends AbstractFoo{}
>
> Essentially, you move the "implements" statement from the concret to
> the abstract class. This looks more logical anyways, one might think.
> But remember: both ways are valid in Java.
>
>
> Attached you'll find a full GWTTestCase, which documents the issue.
>
> Regards,
> Stefan
>
>
> package client;
> import com.google.gwt.junit.client.GWTTestCase;
>
>
> public class InterfaceImplementationTest extends GWTTestCase {
>
>        @Override
>        public String getModuleName() {
>                return "Test";
>        }
>
>        /**
>         * Simple Interface
>         *
>         */
>        interface Bar {
>                String get();
>                void set( String v );
>        }
>
>        public void testWillSucceed /* both in hosted and web mode */ () {
>
>                abstract class AbstractBar {
>                        String v;
>                        public String get() { return v; }
>                        public void set(String v) { this.v = v; }
>                }
>                class MyBar extends AbstractBar implements Bar {}
>
>                Bar bar = new MyBar();
>                bar.set( "foo" );
>                assertEquals( "foo", bar.get() );
>        }
>
>        /**
>         * Generic Interface
>         *
>         * @param <T>
>         */
>        interface Foo<T> {
>                T get();
>                void set( T v );
>        }
>
>        public void testWillFailInWebMode /* but will succeed in hosted mode 
> */ () {
>
>                abstract class AbstractFoo {
>                        String v;
>                        public String get() { return v; }
>                        public void set(String v) { this.v = v; }
>                }
>                class MyFoo extends AbstractFoo implements Foo<String> {}
>
>                // This will work OK...
>                MyFoo myfoo = new MyFoo();
>                assertNull( myfoo.get() );
>                myfoo.set( "bar" ); // this won't fail
>                assertEquals( "bar", myfoo.get() );
>
>                // ...but this won't!
>                Foo<String> foo = new MyFoo();
>                assertNull( foo.get() );
>                foo.set( "bar" ); // FAILS with
> "com.google.gwt.core.client.JavaScriptException: (TypeError): foo.set
> is not a function"
>                assertEquals( "bar", foo.get() );
>        }
> }
>
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/Google-Web-Toolkit?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to