inference of throws type parameters in SAMs
Remi Forax
forax at univ-mlv.fr
Wed Oct 31 10:37:03 PDT 2012
On 10/31/2012 06:20 PM, Maurizio Cimadamore wrote:
> On 31/10/12 17:04, Remi Forax wrote:
>> On 10/31/2012 03:53 PM, Dan Smith wrote:
>>> This is on the radar for inference. As you suggest, we would
>>> probably just choose RuntimeException in certain scenarios rather
>>> than using the upper bound.
>>>
>>> We have toyed with some more ambitious ideas for handling exceptions
>>> in lambda bodies, but those won't be part of Java 8.
>>>
>>> —Dan
>> yes, and my fear is that if we choose something different than Object
>> now (like RuntimeException)
>> we will not be able to change the inference algorithm in Java 9.
>> At least with Object as default, we know that currently the inference
>> fails so
>> we can provide a better one without creating incompatibilities.
> I think Object is never a problem - for this kind of issues to show
> up, the inference variable must appear in the throws clause, which
> means it should be at least <: Throwable.
yes, sorry,
s/Object/Throwable
Choosing the bound of the unconstrained variable if the variable is used
in a throws in not the better choice,
but before we came with a better algorithm, it's a better choice than
RuntimeException because it doesn't
hamper the use of a better algorithm in the future.
>
> Maurizio
Rémi
>>
>> Rémi
>>
>>> On Oct 30, 2012, at 10:18 AM, Peter Levart <peter.levart at gmail.com>
>>> wrote:
>>>
>>>> Hi all,
>>>>
>>>> I know this has been discussed before, but a long time has passed and
>>>> various inference algorithms have been tried in the meanwhile. So I
>>>> would like to ask whether current state is final. For example if I
>>>> have
>>>> a functional interface like the following:
>>>>
>>>> public interface ThrowingFactory<T, E extends Throwable> {
>>>> T make() throws E;
>>>> }
>>>>
>>>>
>>>> And a "hypothetical" method:
>>>>
>>>> public interface Stream<T> {
>>>> <E extends Throwable> T findFirstOrElse(ThrowingFactory<T, E>
>>>> other) throws E;
>>>> }
>>>>
>>>>
>>>> Then the following program compiles OK:
>>>>
>>>> public static void main(String... args) throws IOException
>>>> {
>>>> Stream<String> stream = null;
>>>>
>>>> String first = stream.findFirstOrElse(() -> {throw new
>>>> IOException();});
>>>> }
>>>>
>>>>
>>>> Which indicates that the inference algorithm does it's job correctly.
>>>> But the following program:
>>>>
>>>> public static void main(String... args)
>>>> {
>>>> MyStream<String> stream = null;
>>>>
>>>> String first = stream.findFirstOrElse(() -> "NO VALUE");
>>>> }
>>>>
>>>>
>>>> Triggers the compilation failure:
>>>>
>>>> error: unreported exception Throwable; must be caught or declared
>>>> to be
>>>> thrown
>>>> String first = stream.findFirstOrElse(() -> "NO VALUE");
>>>>
>>>>
>>>> Regards, Peter
>>>>
>>>>
>>>>
>>>> P.S. If this worked, the controversial TypeThatMustNotBeNamed<T> which
>>>> is used as return type of 3 Stream methods could be replaced with
>>>> 3*3=9
>>>> Stream methods that would more or less fit the main purpose of being
>>>> fluent. For example, current Stream.findFirst() would expand to:
>>>>
>>>> public interface Stream<T> {
>>>> T findFirst() throws NoSuchElementException;
>>>> T findFirstOrElse(T other);
>>>> <E extends Throwable> T findFirstOrElse(ThrowingFactory<T, E>
>>>> other) throws E;
>>>> }
>>>>
>>>> Is this to much methods?
>>>>
>>>>
>>>>
>>
>
More information about the lambda-dev
mailing list