Ошибка компиляции с Необязательным в универсальном классе

1

У меня есть необъяснимая ошибка компиляции с guava Необязательно у меня есть этот тест для демонстрации:

package com.livingobjects.pmin.test;

import com.google.common.base.Optional;
import org.junit.Test;

public class OptionalTest {

    public class ContainOptional<T> {
        T id;
        Optional<String> label;

        public ContainOptional(T id, Optional<String> label) {
            this.id = id;
            this.label = label;
        }

        public T getId() {
            return id;
        }

        public Optional<String> getLabel() {
            return label;
        }
    }

    @Test
    public void shouldGetOptional() throws Exception {
        ContainOptional co = new ContainOptional<>(42, Optional.of("H2G2"));
        String label = co.getLabel().get();     // Can not compile

        Optional<String> opt = co.getLabel();   // Can
        String labelOpt = opt.get();            // compile
    }
}

Когда я пытаюсь получить опцию из универсального объекта контейнера, мне нужно использовать промежуточную переменную вместо встроенного кода. Когда я использую вызов цепи co.getLabel().get(); Необязательный объект Option.get вместо String?

EDIT: Я использую Guava 17.0 и Java 1.7.0_51

  • 0
    (Не берите в голову мой предыдущий комментарий; я неправильно понял вопрос.) Это не характерно для Гуавы, но, похоже, является общей проблемой с дженериками. Похоже, что если общий параметр (здесь T ) не указан, другие общие части, даже те, которые не зависят от T , возвращаются к Object . Но даже если вы просто используете ContainOptional<?> co = ... это работает.
  • 1
    Правильное добавление <?> Решит проблему. Я нахожу странным, что все общие затронуты ... Благодаря вам двоим
Теги:
optional
guava

1 ответ

2

В линии

ContainOptional co = new ContainOptional<>(42, Optional.of("H2G2"));

ContainOptional должен иметь параметр, но не делает этого, поэтому компилятор игнорирует все дженерики этого класса и использует Object везде. Написать:

ContainOptional<Integer> co = new ContainOptional<>(42, Optional.of("H2G2"));

и он должен работать. (Integer - это тип 42).

  • 0
    +1 Если вы не знаете тип, вы можете просто использовать ContainOptional<?> co = ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню