2015-11-30 104 views
2

我想獲得java.util.function.Function的結果類型。 (如果返回類型已經是可選的,那麼我不必做任何事情,但除此之外,我必須將其包裝在可選項中,並且出於顯而易見的原因,我不想將其包裝兩次。代碼:從函數獲取泛型

public static void main(String[] args) { 
    printType(Integer::parse); 
    printType(new Foo()); 
    printType(Functions::tryParseInt); 
} 

public static void printType(Function<String, ?> function) { 
    System.out.println(function.getClass()); 
    System.out.println(function.getClass().getGenericInterfaces()[0]); 
    if (!returnsOptional(function)) function = function.then(Optional::ofNullable); 
    [...] 
} 

private static class Foo implements Function<String, Integer> { 
    @Override 
    public Integer apply(String t) { 
     return Integer.parse(t); 
    } 

} 

public static Optional<Integer> tryParseInt(String a) { 
    return Optional.empty(); 
} 

我得到這個結果爲:

class my.util.Functions$$Lambda$1/1705736037 
interface java.util.function.Function 
class my.util.Functions$Foo 
java.util.function.Function<java.lang.String, java.lang.Integer> 
class my.util.Functions$$Lambda$3/764977973 
interface java.util.function.Function 

但實際上我想從方法獲得 java.lang.Integer中或java.util.Optional 對於第二個這個作品。使用get getGenericS uperClass()+ ParameterizedType,但不是其他兩個?我究竟做錯了什麼?

Java版本 「1.8.0_51」

+1

什麼是'Integer.parse'?什麼是'功能:tryParseInt'? –

+0

由於類型刪除,如果這通常是可行的,我會感到中度驚訝。 –

回答

1

你沒有做錯什麼(至於getGenericInterfaces)。

類別Foo包含其聲明中的完整類型信息。這可用於其對應的Class對象。

對於由方法引用產生的實例所生成的動態「代理」類,不能這麼說。推斷的泛型類型參數不保存在最終生成實例的字節碼中。