Proposal: Automatic Resource Management
Neal Gafter
neal at gafter.com
Wed Mar 4 06:47:51 PST 2009
Remi-
Do you have any evidence that this is a sound extension of the type system?
-Neal
On Wed, Mar 4, 2009 at 4:58 AM, Rémi Forax <forax at univ-mlv.fr> wrote:
> Joshua Bloch a écrit :
>> Mark,
>> Sorry for the delay, and thanks so much for the report! This is an
>> interesting case. It seems unfortunate that DataCacheManagerImpl extends
>> Closeable, given that its close method doesn't throw any checked exceptions.
>> But it got me thinking, and I came to the conclusion that there's no reason
>> for the Disposable interface to be parameterized! Its close method should
>> just throw Exception. Then Closeable and DataCacheManager can both extend
>> Disposable. The Disposable interface won't be terribly useful as a parameter
>> type, but who cares? Its raison d'etre is the automatic resource management
>> statement. In this context, the close method is invoked on a resource using
>> its declared type. That means that it throws whatever exceptions it's
>> declared to throw (as per the desugaring in my proposal). I will modify the
>> proposal accordingly and repost it. I think this is a real improvement!
>> It's both simpler and more broadly applicable.
>>
>> Thanks so much,
>>
>> Josh
>>
> There is another way, change the JLS :)
>
> In my opinion, the last sentence of section 8.1.5 of the JLS is too
> restrictive:
> "A class may not at the same time be a subtype of two interface types which
> are different invocations of the same generic interface (§9.1.2)
> <http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#78598>,
> or an invocation
> of a generic interface and a raw type naming that same generic interface."
>
> This sentence is weird because the last part of section 8.1.5 explain
> how to detect clash between methods from different interfaces
> by taking a look to their return types.
>
> So in case of different interfaces, the compiler have to do a calculation
> involving the member methods but if interfaces are generics
> it doesn't do any calculation on member methods.
> That is not consistent.
>
> Note than the detection algorithm is not exactly the same because
> one can have a clash between bridge methods.
>
> I'm proposing to remove the last sentence of section 8.1.5
> and replace it by a one saying that if there is of two or more
> generics super-interfaces, member methods of their raw types
> should not have the same signature.
>
> With theis new rule, the following examples will now compile:
>
> interface Duplicate<X> {
> X duplicate();
> }
>
> class A implements Duplicate<Integer>, Duplicate<Number> {
> public Integer duplicate() {
> return null;
> }
> }
>
> and
>
> interface Disposable<E> {
> public void dispose() throws E;
> }
>
> class Connection implements Disposable<IOException>,
> Disposable<Exception> {
> public void dispose() throws IOEXception {
>
> }
> }
>
>
> There is another reason why I don't like the last sentence of section 8.1.5,
> this sentence is not compatible with section 13.4.4 on binary compatibility:
> "Changing the direct superclass or the set of direct superinterfaces of
> a class type will not break compatibility
> with pre-existing binaries, provided that the total set of superclasses
> or superinterfaces,
> respectively, of the class type loses no members."
>
> cheers,
> Rémi
>
>
>
>
>
More information about the coin-dev
mailing list