Ошибка компиляции ImmutablePair и пары в декомпилированном классе - PullRequest
1 голос
/ 02 февраля 2020

Я создал следующий минимальный воспроизводимый пример

Я получил ошибку компиляции

Eclipse Ошибка компиляции Eclipse . «Тип Pair не определяет getValue (Object), который применим здесь»

IntelliJ говорит Ошибка компиляции IntelliJ

Я пытаюсь использовать часть лога c из файла jar, поэтому я не написал этот logi c, но этот код работает нормально из декомпилированного класса.

Я поместил этот logi c в свой собственный класс и получил ошибку компиляции

import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;

import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
public class TestClass
{

    /**
     * @param args
     */
    public static void main(final String[] args)
    {
        final Map<ObjectAttributesValueContainer, Set<CompareAttribute>> differences = null;

        final Map<CompareAttribute, Collection<ObjectAttributesValueContainer>> differentObjectsForAttributes = (Map) differences
                .entrySet().stream().flatMap((entry) -> {
                    return ((Set) entry.getValue()).stream().map((attr) -> {
                        return new ImmutablePair(entry.getKey(), attr);
                    });
                }).collect(Collectors.toMap(Pair::getValue, (pair) -> {
                    return new HashSet(Collections.singleton(pair.getKey()));
                }, (a1, a2) -> {
                    a1.addAll(a2);
                    return a1;
                }));
    }

}


class CompareAttribute
{
    private String qualifier;
    private String group;

    public CompareAttribute(final String qualifier)
    {
        this.qualifier = qualifier;
    }

    public CompareAttribute(final String qualifier, final String group)
    {
        this(qualifier);
        this.group = group;
    }

    public String getQualifier()
    {
        return this.qualifier;
    }

    public void setQualifier(final String qualifier)
    {
        this.qualifier = qualifier;
    }

    public String getGroup()
    {
        return this.group;
    }

    public void setGroup(final String group)
    {
        this.group = group;
    }

    @Override
    public boolean equals(final Object o)
    {
        if (this == o)
        {
            return true;
        }
        else if (o == null)
        {
            return false;
        }
        else if (o.getClass() != this.getClass())
        {
            return false;
        }
        else
        {
            final CompareAttribute that = (CompareAttribute) o;
            if (!this.qualifier.equals(that.qualifier))
            {
                return false;
            }
            else if (((CompareAttribute) o).getGroup() == null && this.group == null)
            {
                return true;
            }
            else
            {
                return ((CompareAttribute) o).getGroup() != null && this.group != null ? this.group.equals(that.group) : false;
            }
        }
    }

    @Override
    public int hashCode()
    {
        int result = this.qualifier.hashCode();
        if (this.group != null)
        {
            result = 31 * result + this.group.hashCode();
        }

        return result;
    }

    @Override
    public String toString()
    {
        return this.qualifier + (this.group != null ? '@' + this.group : "");
    }
}

class ObjectAttributesValueContainer
{
    private final Object object;
    private final Map<CompareAttribute, Object> attributeValues;

    public ObjectAttributesValueContainer(final Object object)
    {
        this.object = object;
        this.attributeValues = new HashMap();
    }

    public Object getObject()
    {
        return this.object;
    }

    public Map<CompareAttribute, Object> getAttributeValues()
    {
        return this.attributeValues;
    }
}

1 Ответ

0 голосов
/ 03 февраля 2020

Вы не можете привести к map определенного типа, поэтому я удалил это. Ваш

return ((Set) entry.getValue()).stream().map((attr) -> {...

никогда не сможет работать, потому что flatmap должен возвращать stream.

Я сделал несколько предположений и добавил несколько типов. Теперь, по крайней мере, он компилируется. Сначала я удалил предупреждение:

public ObjectAttributesValueContainer(final Object object) {
  this.object = object;
//  this.attributeValues = new HashMap();
  this.attributeValues = new HashMap<>();
}

Затем я отслеживал типы:

final Map<CompareAttribute, Collection<ObjectAttributesValueContainer>> 
  differentObjectsForAttributes = 
  differences
        .entrySet()
        .stream()
        .flatMap((entry) -> 
                   entry.getValue() // Set<CompareAttribute>
                   .stream()
                   .map((attr) -> {return new ImmutablePair<ObjectAttributesValueContainer,CompareAttribute>
                                                            (entry.getKey(), attr);}
                 ))
        // now we have a stream of ImmutablePair<ObjectAttributesValueContainer,CompareAttribute>
         .collect(Collectors.toMap(Pair::getValue, 
                                   (pair) -> {return new HashSet<ObjectAttributesValueContainer>
                                                               (Collections.singleton(pair.getKey()));
                                             }, 
                                   (a1, a2) -> {a1.addAll(a2);
                                                return a1;
                                               }
                                   ));
...