簡體   English   中英

Java Cast實用程序庫

[英]Java casting utility library

我想知道是否存在一個庫來執行一堆平凡的演員表(基本上是一堆可能不安全的演員表的包裝器,在大多數情況下,這在實踐中不是問題)。 例如,假設我在庫中有以下內容(為了簡潔起見,為了簡化):

public interface LibraryInterface;

public static void doSomething(Collection<LibraryInterface> collection);

所以doSomething()固執地只采取比可能的更不靈活的東西(即Collection<? extends LibraryInterface> 。是否有一個庫提供與下面相同的函數:

public static <T, U extends T> Collection<T> cast(Collection<U> collection);

因此,如果我有一個實現LibraryInterface的類,並且我有一個List<MyLibraryInterfaceImpl> ,我仍然可以通過強制轉換該列表來使用doSomething() cast()的主體暗示包含不安全的演員,但至少從用戶的角度來看,演員表被隱藏起來或集中在一個地方)。

(也很好,對比像Comparator這樣的東西)

這樣的圖書館是沒有意義的。 由於類型擦除,除了刪除編譯器警告之外,強制轉換為父類絕對沒有任何作用。 此外,圖書館將要做的是直接演員或做集合的副本。 換句話說,它要么完全是你不想做的事情,要么是你使用這個庫,或者是非常低效和無用的東西......

如果您想在進行不安全的演員表之前檢查收藏品的內容,那么向下轉播更有意義。 您可以創建一個迭代整個集合的函數來檢查所有元素的類型,然后通過執行不安全的強制轉換來返回集合。 你可以用~3行寫這個函數;)。

您的cast(Collection<U> collection)方法所做的一切都可以通過<T extends LibraryInterface> doSomething(Collection<T> collection)

圖書館的額外點是什么?

而且,如果API構建器決定使用類型不變量,那么這基本上意味着他嚴格要求您遵守合同並僅提供LibraryInterface或專為特定用途而設計。 在Java泛型中也是type erasure你可以這樣做

List<? extends Object> p = new ArrayList<Object>();

但現在List<? extends Object> p = new ArrayList<? extends Object>(); List<? extends Object> p = new ArrayList<? extends Object>(); 以上是非法的。 所以首先沒有類型轉換和循環,我不知道實現這樣一個庫的任何其他方式。

因此,對於您想要做的事情,仿制葯是共同變體,即

List<Object> p = new ArrayList<String>();

無論你想要什么用途,它本來是可能的。 但上述陳述是非法的。 因此你不能省略它。

因此,執行上述操作的唯一方法是循環和檢查,然后最終鍵入強制轉換。

更多信息可以在這里這里找到

現在,這樣的圖書館會做什么?

void flexibleDoSomething(Collection<? extends LibraryInterface> collection) {
    doSomething((Collection<LibraryInterface>) collection);
}

這種方法看起來不值得一個庫。 這樣做不會增加任何類型的安全性。 顯然,更好的辦法是首先修復其他庫。 但是你總是可以內聯這個方法。

在某些情況下,我已經看到這樣的庫正在使用中。 很大程度上是為了讓演員們頻繁地集中在一個班級,或者因為他們中的一些在語法上是混亂的。 例如,對於復雜的泛型,將Class<Foo<?>>Class<Foo<Something>>

請注意,使用泛型時, 每個類型都應出現在右側,以確保它將被編譯器正確綁定。

public static <T, U extends T> Collection<T> cast(Collection<U> collection);

對於此方法,編譯器將很樂意假設TObject

為了獲得更嚴格的泛型,你可能想要使用類似的東西

public static <T, U extends T> Collection<T> cast(Collection<U> collection, Class<T> clz);

這樣,您實際上可以指定T ,並且(好吧,不適用於Collection ,但對於其他情況),實用程序方法也可以執行某些類型檢查。

暫無
暫無

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

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