泛型类中的可选编译错误

时间:2014-08-29 08:29:40

标签: java guava optional

我有一个无法解释的编译错误与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

1 个答案:

答案 0 :(得分:2)

在第

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

ContainOptional应该有一个参数但不是,所以编译器会忽略该类的所有泛型并在任何地方使用Object。写:

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

它应该有效。 (Integer是[{1}})的类型。