2015-07-02 3 views
2

У меня есть мое собственное выполнение в течение нескольких кортежей, вот суть коды для пары:Тип проблема с кортежами и потоков (Java8)

public class Pair<A, B> extends Tuple implements Serializable{ 
    ... 
    public Pair(A a,B b){ 
     this.a=a; 
     this.b=b; 
    } 
    ... 
    public <T> Pair<T,B> mapA(Function<A,T> fun){ 
     return new Pair<T,B>(fun.apply(a),b); 
    } 
    ... 
} 

По какой-то странной причине, следующий код не работает а компилятор, похоже, считает, что полученная пара от первого отображения равна <Object,String>.

List<Pair<String,String>> pairs = ...; 
pairs 
.stream() 
.map(p->mapA(s->s.trim()) 
.map(p->mapA(s->s.toUpperCase()) //does not recognize a as a string 
... 

Может ли это быть также Eclipse, действующего? Запуск Eclipse Luna fwiw, который, как представляется, делает дерьмовую работу в целом при определении общих типов из функциональных интерфейсов.

EDIT: полный пример, как просил

public class Pair<A, B> implements Serializable{ 
    public final A a; 
    public final B b; 

    public Pair(A a,B b) { 
     this.a = a; 
     this.b = b; 
    } 

    public <T> Pair<T,B> mapA(Function<A,T> fun){ 
     return new Pair<T,B>(fun.apply(a),b); 
    } 

} 


List<Pair<String,String>> pairs = new ArrayList<>(); 
pairs.add(new Pair<String,String>("foo","bar")); 
pairs.stream() 
.map(p->p.mapA(s->s.trim())) 
.map(p->p.mapA(s->s.toUpperCase())) 
.collect(Collectors.toList()); 
+2

Можете ли вы представить полный и воспроизводимый пример? –

+0

sec ... также попробовал отливку fun.apply (a) to T – Seppo420

+0

@SotiriosDelimanolis забыл hilite – Seppo420

ответ

0

Обновлено затмить Марс и проблема полностью исчезла.

4

Тип вывода для метода набранного не работает с лямбды.

Кроме того, у вас есть ошибка кодирования (вы ссылались на метод mapA() без экземпляра).

Вы можете решить эту проблему, явно введя метод:

pairs.stream() 
.map(p -> p.mapA(s -> s.trim())) // input type is known here from stream 
.map(p -> p.<String>mapA(s -> s.toUpperCase())) // but not here 

Хотя только вопрос стиля, вы могли бы переписать выше с помощью ссылки метод:

pairs.stream() 
.map(p -> p.mapA(String::trim)) 
.map(p -> p.<String>mapA(String::toUpperCase)) 
+0

Работает на примере, но почему-то не для моего фактического использования. Триплет triplets ...; triplets.stream(). MAPC (MyItem :: нагрузки). mapC (MyItem :: getTitle) ... Жалуется, что getTitle не определен для объекта. i-> i.getTitle() не работает. – Seppo420

+0

Я, очевидно, мог бы сделать что-то вроде mapC (r-> MyItem.load (ref) .getTitle()), но мне бы хотелось, чтобы все три карты были привязаны к в любом другом месте. – Seppo420

+0

Теперь этот пример больше не работает ... darn eclipse ... EDIT: получается, что он работает при использовании 'p.mapA (String :: trim)', но не с 'p.mapA (s-> s.trim()) ... ... Дело в реальной жизни не срабатывает как с tho – Seppo420

Смежные вопросы