我們可以像這樣在 Java 中創建一個泛型類
public class MyClass<T> {
...
但是,現在我正在將一個(非常大的)C 代碼翻譯成 Java,我需要一個與其他類不同的類,這取決于它的大小,就像在這個 C 代碼中一樣:
template<size_t size> class MyClass {
...
所以每個類都是不同的型別,有static不同的成員,像“比較”這樣的成員只能與具有相同size.
可以在 Java 中做到這一點嗎?如果沒有,你會如何處理?
uj5u.com熱心網友回復:
不,您不能使用值作為引數而不是 Java 中的泛型型別。您可能應該將大小作為建構式中的引數,并在考慮到大小的情況下實施安全檢查。
uj5u.com熱心網友回復:
當然可以,但是很爛。
您可以使用一系列遞回型別來模擬“計數”。 Inc<Inc<Inc<Integer>>可以表示 3。
這是非常尷尬的。
Java 泛型不是 C 模板。Java 泛型有一個通用的基礎實作,并自動撰寫一些包裝代碼,以在瘦包裝器中將引數化引數轉換為/從通用基礎轉換。
C 模板生成不同的型別。
C 模板的設計是為了取代代碼生成和/或手工制作的 C 代碼低級資料結構。目標是模板類可以匹配甚至超過手寫的 C 版本(超過是因為您可以在單個模板上投入更多的工程作業,并在 100 多個位置重復使用它)。
模板std::function更接近于 Java 泛型。雖然實作不同,但在這里它將多種型別轉換為一個介面,對最終用戶隱藏轉換。在 C 中,這種技術稱為型別擦除,其中 std 函式“擦除”有關存盤的可呼叫物件的所有資訊,除了它公開的內容。
但是因為 Java 泛型只支持型別 erssure 的一種子型別,并且 C 模板不僅支持更多型別的型別擦除,而且還支持完全不同的與 Java 不同的元編程技術,所以用 Java 泛型替換模板將始終遇到問題。只有當 C 用例恰好與較弱的 Java 泛型完美對齊時,它才能正常作業。
(請注意,雖然較弱,但 Java 泛型使型別擦除更容易,因為它們為您撰寫了一堆強制轉換代碼,并對其進行型別檢查。較弱并不意味著更糟;它通常意味著更安全。但機械地用較弱的人往往注定要失敗。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/377475.html
上一篇:嘗試在OpenFOAM9中創建求解器時出現環境變數錯誤
下一篇:如何構建Github投資組合
