簡體   English   中英

為什么抑制這種未經檢查的警告是安全的?

[英]Why is it safe to suppress this unchecked warning?

考慮Effective Java泛型章節中定義的UnaryFunction接口。

public interface UnaryFunction<T> {
T apply(T arg);
}

以及用於返回UnaryFunction的以下代碼

// Generic singleton factory pattern
private static UnaryFunction<Object> IDENTITY_FUNCTION = new UnaryFunction<Object>() {
  public Object apply(Object arg) { return arg; }
};

// IDENTITY_FUNCTION is stateless and its type parameter is
// unbounded so it's safe to share one instance across all types.
@SuppressWarnings("unchecked")
public static <T> UnaryFunction<T> identityFunction() {
  return (UnaryFunction<T>) IDENTITY_FUNCTION;
}

為什么IDENTITY_FUNCTION(UnaryFunction<T>)安全?

這本書說的是我要問的問題,但我不能遵循這里的邏輯。 我們在哪里調用執行身份操作的apply函數? 我很困惑,因為它是返回傳遞給它的同一個對象而不修改任何東西的函數。

IDENTITY_FUNCTION轉換為(UnaryFunction<T>)生成未經檢查的強制轉換警告,因為UnaryFunction<Object>不是每個TUnaryFunction<T> 但是身份函數是特殊的:它返回其參數未經修改,因此我們知道將它用作UnaryFunction<T>T的值,無論UnaryFunction<T>的值是什么。 因此,我們可以放心地抑制由此強制轉換生成的未經檢查的強制轉換警告。 完成此操作后,代碼將編譯而不會出現錯誤或警告。

隨着類型擦除

T apply(T arg);

實際上是

Object apply(Object arg);

現在為了身份

Abc x = ...;
Abc y = IDENTITY.apply(x);

可以假設它總是正確的(相當於y = x; )。

(非常務實。)

演員是安全的,因為身份函數首先返回傳遞給它的確切對象。 因此,在運行時,通用參數T沒有可以違反強制轉換的特化。

Aka,你正在投射一個對象,因為它是自己的類型。

identityFunction()只返回函數本身,用於不同的對象。

以下是一個用法示例:

String result = identityFunction().apply("Hello");

類型安全警告很重要。 它就在那里,因為實現了IDENTITY_FUNCTION,使得編譯器不能保證函數返回與輸入相同的類型。 考慮以下替代實現:

private static UnaryFunction<Object> CONST_FUNCTION = new UnaryFunction<Object>() {
    public Object apply(Object arg) { return "Default"; } 
};

此實現始終返回一個字符串,因此將其作為一般數據類型的一元函數返回顯然是不安全的。

在我們的例子中(IDENTITY_FUNCTION),返回類型與輸入類型相同的證明在實現中。 我們返回相同的實例,因此保證它們具有相同的類型。 當您禁止類型安全警告時,建議使用校樣來證明它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM