[英]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);
對於此方法,編譯器將很樂意假設T
是Object
。
為了獲得更嚴格的泛型,你可能想要使用類似的東西
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.