У меня есть необъяснимая ошибка компиляции с 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
В линии
ContainOptional co = new ContainOptional<>(42, Optional.of("H2G2"));
ContainOptional
должен иметь параметр, но не делает этого, поэтому компилятор игнорирует все дженерики этого класса и использует Object
везде. Написать:
ContainOptional<Integer> co = new ContainOptional<>(42, Optional.of("H2G2"));
и он должен работать. (Integer
- это тип 42
).
ContainOptional<?> co = ...
T
) не указан, другие общие части, даже те, которые не зависят отT
, возвращаются кObject
. Но даже если вы просто используетеContainOptional<?> co = ...
это работает.<?>
Решит проблему. Я нахожу странным, что все общие затронуты ... Благодаря вам двоим