eliminate gcjh?

Eric Blake ebb9@byu.net
Tue Mar 9 14:24:00 GMT 2004


Per Bothner wrote:
> Tom Tromey wrote:
>>> We're going to be facing some real problems with gcjh once we start
>> looking at 1.5. For instance, 1.5 has covariant methods,
>> Are you sure? I can't find documentation on this. Is it considered
> part of one the other new features, such as Generics?

Covariance is an artifact of generics, and is (somewhat poorly) documented in 
JSR 14 (the latest document is jsr14-spec10.pdf, bundled with the 2.4 early 
access prototype implementation). Not only that, but the 1.5 JDK library uses 
covariant methods, so the 1.5 javac allows covariant methods for ALL -source 
levels (even though generics, varargs, foreach loops, static imports, 
autoboxing, and attributes are only valid at -source 1.5).
Binary compatibility also argues that covariant methods exist. Jacks has a 
couple of test cases that make sure the compiler doesn't crash when a 
covariant return type is acheived by a sequence of compilations, even in 
pre-1.5 compilers.
Covariance is implemented by bridge methods. If I write:
class A {
 A foo() { return this; }
}
class B extends A {
 B foo() { return this; } // covariant!
}
The compiler generates:
class A {
 A foo() { return this; } // A.foo()LA;
}
class B {
 B foo() { return this; } // B.foo()LB;
 /*ACC_SYNTHETIC ACC_BRIDGE*/ A foo() { return <B.foo()LB;>; } //B.foo()LA;
}
And a third party class calls:
class C {
 void m()
 {
 A a = new A();
 B b = new B();
 a.foo(); // A.foo()LA;, call stack depth 1
 b.foo(); // B.foo()LB;, call stack depth 1
 a = b;
 a.foo(); // bytecode says A.foo()LA;, VM calls B.foo()LA;,
 // call stack depth 2
 }
}
>> > I don't think you can express this in C++.
>> C++ has covariant return types.

However, g++ currently does not correctly implement it in the complex corner 
cases. There are some issues if you try to mix multiple, virtual inheritance 
with covariance in C++. And other compilers out there (including some of the 
popular non-free ones) don't do covariance at all, even though it is in the 
standard, so portable C++ should not use covariance.
-- 
Someday, I might put a cute statement here.
Eric Blake ebb9@byu.net


More information about the Java mailing list

AltStyle によって変換されたページ (->オリジナル) /