Exception transparency

Rémi Forax forax at univ-mlv.fr
Wed Jun 9 04:37:27 PDT 2010


Le 09/06/2010 12:06, Maurizio Cimadamore a écrit :
> On 09/06/10 09:23, Maurizio Cimadamore wrote:
>    
>> On 09/06/10 00:44, Neal Gafter wrote:
>>
>>      
>>>>    Function<throws IOException>    e = #(IOException e){...};
>>>>
>>>>          
>> Hi
>> just to be clear, on which basis would you reject the above statement? I
>> guess your argument is that a lambda accepting an argument  of type E
>> cannot be SAM-converted to an interface whose method accepts an argument
>> of type 'throws E' (and, more generally, that E and 'throws E' are not
>> interchangeable). Am I reading correctly?
>>
>>      
> To be clearer, what I mean is, given the following declarations:
>
> class Foo<throws E>  { ... }
>
> Foo<throws MyException>  foo1 = ... //1
> Foo<MyException>  foo2 = ... //2
> foo1 = foo2; //3
>
> *) What is the type parameter of Foo in (1) ? A disjunctive type having
> one component (of type MyException)? Or a straight type-parameter (non
> disjunctive) of type MyException?
>
> *) is (2) allowed? If so what is the semantics? Does the singleton type
> MyException get converted into a disjunctive type having just one
> component (of type MyException)?
>
> *) is (3) allowed? If so, depending on the semantics you choose for (1)
> and (2), aren't we (indirectly perhaps) already supporting a form of
> 'covariance', as we assume that C<E>  <: C<throws E>  because E<: throws
> E ? If so, what are the consequences of these subtyping rule?
>
> Maurizio
>    

you can also add:

Foo<? extends throws MyException> foo3 = ...
and
Foo<throws ? extends MyException> foo4 = ...

And please remember that use-site variance (i.e ? extends/super) is 
something that is not easy to grasp,
only few of my students understand it correctly. Declaration site 
variance seems easier.

Rémi


More information about the lambda-dev mailing list