2015-10-27 23 views
-1

假設我有這個類聲明泛型時是否有語法糖?

class Generic<T extends List<? extends Integer>, E extends List<? extends Integer>> 

或任何長泛型類型鑽石括號內。在使用這個類時,爲了保持類型安全,我需要不斷提及泛型類型。因此,舉例來說,如果我要遍歷上面的類的Set或操縱它,我需要做到以下幾點:

class SomeClass { 

    <T extends List<? extends Integer>, E extends List<? extends Integer>> void add(Set<Generic<T, E>> mySet, Generic<T, E> toAdd) { 

     mySet.add(toAdd); 
    } 

    <T extends List<? extends Integer>, E extends List<? extends Integer>> void iterate(Set<Generic<T, E>> mySet) { 

     for (Generic<T, E> myGeneric : mySet) 
     { 
       // do something with myGeneric 
     } 
    } 
} 

然而,這變得非常麻煩非常快。我搜索並找不到某種方式來正確處理這個問題。我知道可以寫Generic<?, ?>,但是這儘可能地妨礙了類型安全檢查。

有沒有辦法正確處理這個問題?某種方式來命名T extends List<? extends Integer>, E extends List<? extends Integer並將該名稱用作語法快捷方式?

快速注:我不是在談論Java 7中引入了初始化語法糖在右手邊可以使用類型推斷從聲明空鑽石括號。

+0

不,不存在 –

回答

2

不是真的,但我認爲你不能正確使用類型參數。

當你的方法是通用的,那麼你可以很容易地參考的方法的類型參數,而無需每次都重寫他們的界限:

<T extends List<? extends Integer>, E extends List<? extends Integer>> 
void iterate(Set<Generic<T, E>> mySet) { 
    for (Generic<T, E> myGeneric : mySet) { 
     // do something with myGeneric 
    } 
} 

這也是有效的,如果你的類是通用的,即是這樣的:

class SomeClass<T extends List<? extends Integer>, E extends List<? extends Integer>> { 
    void iterate(Set<Generic<T, E>> mySet) { 
     for (Generic<T, E> myGeneric : mySet) { 
      // do something with myGeneric 
     } 
    } 
} 
+0

是的,在方法或類中聲明泛型類型是我已經知道的東西(無論如何+1),但仍然很煩人。我在想,如果有一種方法可以「命名」「<...>」的所有內容,並在其他地方重複使用該「名稱」。另外,爲什麼你認爲我不能正確使用類型參數? – user1803551

+1

因爲你的代碼甚至沒有編譯 –

+0

糟糕!當我簡化了這個問題時,我失去了正確的代碼。請看我編輯的問題。 – user1803551

1

在Java 8,你可以使用

mySet.forEach(myGeneric -> { 
    ... 
}); 

因此,您根本不需要指定myGeneric類型,它將被推斷出來。儘管這種方法存在一些已知的侷限性(如無法修改外部方法的局部變量或無法拋出檢查的異常)。

+0

是的,很好,但這隻能解決迭代混亂的例子,對吧? – user1803551

+1

@ user1803551,是的,在普通的方法聲明中,您仍然需要指定完整的簽名。 –