我有一个无法解释的编译错误与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
}
}
当我尝试从容器通用对象获取Optional时,我需要使用中间变量而不是内联代码。
当我使用co.getLabel().get();
的链接调用Optional.get返回Object而不是String?
编辑:我使用的是Guava 17.0和Java 1.7.0_51
答案 0 :(得分:2)
在第
行ContainOptional co = new ContainOptional<>(42, Optional.of("H2G2"));
ContainOptional
应该有一个参数但不是,所以编译器会忽略该类的所有泛型并在任何地方使用Object
。写:
ContainOptional<Integer> co = new ContainOptional<>(42, Optional.of("H2G2"));
它应该有效。 (Integer
是[{1}})的类型。