假設我們有一些這樣的界面:
public interface Foo<T> {
<TIn extends T> void encode(TIn value)
T decode()
}
我在我的代碼庫中經常使用 Foo ,但我希望添加 FooTIn extends T以使其更靈活,例如Foo<Map<X>>能夠encodeaHashMap<X>或 a TreeMap<X>。
這非常有效 - 直到我嘗試實作Foo<T[]>似乎無法實作的地方,當它遇到括號時public <TIn extends TItem[]> void encode(TIn array)給出決議錯誤“ ” 。即使是 IntelliJ 在自愿實作介面時也什么都不做。> expected[]
對于它的價值,如果 T 是其他一些具體的最終型別(例如 byte[]、Boolean 等),我似乎可以通過回傳 T 來滿足介面,所以它似乎在這里做了一些隱藏的智能修復。所以看起來這只是一個T[]無法檢測到的問題T[]是最終的。
有人對我如何解決這個問題有任何想法嗎?我真的不在乎TIn extends byte[]只能滿足TIn = byte[],我只想實作介面讓編譯器開心;這樣這個介面就可以在其他地方使用。
uj5u.com熱心網友回復:
這些都沒有意義。首先,您不需要它TIn:
public interface Foo<T> {
void encode(T value);
T decode;
}
class Example {
void test() {
Foo<HashMap<String, Integer>> foo = null;
foo.encode(new HashMap<String, Integer>());
}
}
這編譯得很好。一般來說,如果你宣告一個只在一個地方使用的新型別變數,那是沒有意義的——型別變數只是javac擔心的事情,運行時不知道什么是泛型(型別變數)。因此,除非它們用于鏈接提到型別的 2 個不同位置,否則使用它們沒有多大意義,例如“編碼方法的引數型別,解碼()方法的回傳型別?我不在乎它是什么,但是,對于該Foo型別的任何給定用法,它都是相同的——那種“鏈接”)。
鑒于不需要在方法上引入額外的型別引數encode,因此無需嘗試在那里宣告新的型別 var。
僅在單個位置使用的 typevar 的常用替代方法是?. <F> void foo(List<F> in)和之間沒有功能上的區別void foo(List<?> in)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/494524.html
