Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.java.programmer > #35486

Re: Java 8 Lambda with generic types

From Arne Vajhøj <arne@vajhoej.dk>
Newsgroups comp.lang.java.programmer
Subject Re: Java 8 Lambda with generic types
Date 2016-08-28 07:46 -0400
Organization Aioe.org NNTP Server
Message-ID <npuiub$1a5i$1@gioia.aioe.org> (permalink)
References <df44fc1a-9d48-4ba8-890e-a687d24062a9@googlegroups.com> <cf527430-e940-4ba7-9579-096d1c80bd84@googlegroups.com>

Show all headers | View raw


On 8/28/2016 3:02 AM, Stone Zhong wrote:
> On Saturday, August 27, 2016 at 11:50:40 PM UTC-7, Stone Zhong wrote:
>> It seems sometimes, the compiler is not smart enough to decide the
>> generic parameter type based on labmda argument types, here is an example:
>>
>> I have a interface, say Toy:
>>
>> public interface Toy<E> {
>>     List<E> get();
>> }
>>
>>
>> Now I have a method to process toys, such as:
>>     public static void checkToy(Toy<?> toy) {
>>     }
>>
>> Now, the following code works
>>         checkToy(new Toy<Integer>() {
>>             @Override
>>             public List<Integer> get() {
>>                 List<Integer> ret = Arrays.asList(10);
>>                 return ret;
>>             }
>>         });
>>
>> However, if I have
>>         checkToy(() -> {
>>             return Arrays.<Integer>asList(10);
>>         });
>>
>> I got compiling error: "List<Integer> cannot be converted to
>> List<Object>", it seems compiler tried to create a instance of
>> Toy<Object> instead of Toy<Integer> based on the lambda. Is there a wait
>> to tell the compiler it is Toy<Integer> explicitly with the lambda
>> expression?
>
> I just learned if I put all generic parameter in the method
> parametereven if you do not use it, it helps the compiler to find the
 > right generic parameter type when instantiate the instance.
 > for example:
>
> public interface Toy<E> {
>     List<E> get(E dummy);
> }
>
> did kind of solve the problem, but I do feel bit clumsy doing such thing.

I think the problem really is in your checkToy method.

The following works fine:

import java.util.Arrays;
import java.util.List;

public class GenFun {
     public static interface Toy<E> {
         public List<E> get();
     }
     public static <E> void checkToy(Toy<E> toy) {
         for(E o : toy.get()) {
             System.out.println(o);
         }
     }
     public static void main(String[] args) {
         checkToy(new Toy<Integer>() {
             @Override
             public List<Integer> get() {
                 List<Integer> ret = Arrays.asList(10);
                 return ret;
             }
         });
         checkToy(() -> { return Arrays.<Integer>asList(10); });
     }
}

Arne

Back to comp.lang.java.programmer | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

Java 8 Lambda with generic types Stone Zhong <stone.zhong@gmail.com> - 2016-08-27 23:50 -0700
  Re: Java 8 Lambda with generic types Stone Zhong <stone.zhong@gmail.com> - 2016-08-28 00:02 -0700
    Re: Java 8 Lambda with generic types Arne Vajhøj <arne@vajhoej.dk> - 2016-08-28 07:46 -0400
      Re: Java 8 Lambda with generic types Steven Simpson <ss@my.domain.invalid> - 2016-08-28 15:00 +0100
        Re: Java 8 Lambda with generic types Lew <lewbloch@gmail.com> - 2016-08-30 22:25 -0700
          Re: Java 8 Lambda with generic types Steven Simpson <ss@my.domain.invalid> - 2016-08-31 17:19 +0100
  Re: Java 8 Lambda with generic types Steven Simpson <ss@my.domain.invalid> - 2016-08-28 08:19 +0100
  Re: Java 8 Lambda with generic types Stone Zhong <stone.zhong@gmail.com> - 2016-08-28 03:26 -0700
  Re: Java 8 Lambda with generic types Stone Zhong <stone.zhong@gmail.com> - 2016-08-28 07:45 -0700
    Re: Java 8 Lambda with generic types Arne Vajhøj <arne@vajhoej.dk> - 2016-08-28 13:22 -0400
  Re: Java 8 Lambda with generic types Stone Zhong <stone.zhong@gmail.com> - 2016-08-28 07:57 -0700
  Re: Java 8 Lambda with generic types Stone Zhong <stone.zhong@gmail.com> - 2016-08-28 10:43 -0700
    Re: Java 8 Lambda with generic types Arne Vajhøj <arne@vajhoej.dk> - 2016-08-30 20:35 -0400
  Re: Java 8 Lambda with generic types Stone Zhong <stone.zhong@gmail.com> - 2016-09-02 15:18 -0700

csiph-web