2014-08-29 63 views
1

我有番石榴可選不明原因的編譯錯誤,我有這樣的測試表明:與可選的編譯錯誤在泛型類

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();的連鎖調用時,Optional.get返回Object而不是String?

編輯:我用番石榴17.0和Java 1.7.0_51

+0

(不介意我以前的評論;我誤解了這個問題。)這不是特定於番石榴,但似乎是泛型的一個普遍問題。看起來如果沒有指定通用參數(此處爲「T」),其他通用部分(即使不依賴於「T」的通用部分)也會回退到「對象」。但即使你只是'ContainOptional co = ...'它的工作原理。 – 2014-08-29 08:46:13

+0

右加''解決問題。我發現奇怪的是,所有通用都受到影響... 感謝你兩個 – Marthym 2014-08-29 09:05:59

回答

2

在行

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

ContainOptional應該有一個參數,但沒有,所以編譯器會忽略這個類並使用所有的仿製藥無處不在。寫:

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

它應該工作。 (Integer42的類型)。

+0

+1如果你不知道類型,你甚至可以使用'ContainOptional co = ...'。 – 2014-08-29 08:51:28