2017-02-20 64 views
1

我有下面的測試類在我的Java代碼:爪哇 - 錯誤創建一個功能接口與

對於任何一個
Function<? super Either<? extends Object, ? extends Object>, ? super Either<? extends Object, ? extends Object>> test = new Function<Either<Integer, Integer>, Either<Integer, Integer>>() { 
     @Override 
     public Either<Integer, Integer> apply(Either<Integer, Integer> integers) { 
      return integers; 
     } 
} 

文檔可以在這裏找到:http://static.javadoc.io/io.javaslang/javaslang/2.0.2/javaslang/control/Either.html

,但我得到以下編譯錯誤(Java 8)

Error:(77, 129) java: incompatible types: 
<anonymous java.util.function.Function<javaslang.control.Either<java.lang.Integer,java.lang.Integer>,javaslang.control.Either<java.lang.Integer,java.lang.Integer>>> 
cannot be converted to 
java.util.function.Function<? super javaslang.control.Either<? extends java.lang.Object,? extends java.lang.Object>,? super javaslang.control.Either<? extends java.lang.Object,? extends java.lang.Object>> 

我是新來的Java,我不知道什麼是錯在這裏。任何幫助深表感謝。

我明白這段代碼沒有意義,這不是我真正使用它的方式。我實際上是試圖將一個函數傳遞給一個內部庫。但我不應該得到那個無法轉換的編譯錯誤?超級要麼

謝謝!!

+4

您是java的新手,但您嘗試以非常先進的方式使用泛型;我的建議是:退後一步,看看Java語言的新手會以什麼開頭;-) – GhostCat

+1

提示:'? extends Object'與'?'同義。 – shmosel

+0

爲什麼你不只是將你的變量聲明爲你創建的類型?即Function <既可以是,也可以是>' – Andreas

回答

0

它不工作的原因是因爲? super Either<? extends Object, ? extends Object>(這相當於? super Either<?, ?>)必須能夠接受任何類型Either。例如,以下必須編譯

Either<Long, Long> either = ... 
test.apply(either); 

因爲Either<Long, Long>Either<?, ?>一個子類。但是您的實現只能處理特定的子類型:Either<Integer, Integer>

這是同樣的問題的一個簡單的演示:

Lis<? super Number> numbers = new ArrayList<Integer>(); 

這不會編譯,因爲列表必須是一個類型,它可以接受任何Number,不僅僅是Integer的。

你的情況的理想解決方案取決於你想要做什麼,這是不完全清楚的問題。我可以讓你嘗試最接近的是這樣的:

Function<? super Either<Integer, Integer>, ? extends Either<?, ?>> test = ... 

注意,在第二個參數中的第一個參數使用superextends。這遵循Producer extends, Consumer super的原則。