無法推斷函數建構函數的泛型參數中的類型
php小編柚子將為大家解答一個常見的問題:在建構子的泛型參數中,無法推論出類型的原因。在PHP中,泛型參數的類型推論是透過參數的預設值來實現的。然而,在建構函式中,由於參數是在物件建立之前就被傳入的,因此無法透過物件的實例來推斷參數的類型。這就導致了建構函式中無法推斷出泛型參數的類型,需要手動指定型別來解決這個問題。
問題內容
我在 go 中有一些通用程式碼,其中有一個具有通用參數的「主」類型和許多應該共享相同通用參數的「從」類型。程式碼看起來與此類似:
type Doer[T any] interface { ModifyA(*A[T]) } type B[T any] struct { } func NewB[T any]() *B[T] { return new(B[T]) } func (b *B[T]) ModifyA(a *A[T]) { // Do a thing } type A[T any] struct{} func NewA[T any]() A[T] { return A[T]{} } func (a *A[T]) Run(doers ...Doer[T]) { for _, doer := range doers { doer.ModifyA(a) } } func main() { a := new(A[int]) a.Run(NewB()) // error here }
基本上,使用者應該在 a
上定義 t
,然後 b
上的 t
應該是相同的。此類程式碼可以在支援泛型的其他語言中工作,但在 go 中,我在註解行處收到 cannot infer t
編譯錯誤(請參閱此處的 go playground 程式碼)。在我看來, a
上的類型參數設定為 int
,因此 b
上的類型參數也應設定為 int
。我可以改為呼叫 newb[int]()
,但這對我來說似乎太冗長。為什麼會出現這種情況?
解決方法
這是「為什麼編譯器不能根據傳回類型的使用方式推斷類型參數?」的變體。答:因為從 go 1.20 開始,這不是類型推論的工作方式。
型別推論適用於:
- 類型參數清單
- 使用已知類型參數初始化的替換映射 m(如果有)
- 普通函數參數的(可能為空)列表(僅在函數呼叫的情況下)
如果您一一檢查這些規則:
newb()
有型別參數清單嗎?不。您在呼叫它時沒有指定類型參數。是否有其他已知的型別參數可以用來推論其他型別參數?不,您根本沒有提供任何類型參數。請注意,這種情況適用於您提供部分數量的類型參數的函數調用,例如:
func foo[T any, U *T]() {}
登入後複製在上面您只能提供
t
,例如float64
,編譯器將使用t -> float64
建構替換映射,然後推斷u -> *float64
-
#最後,有普通函數參數的列表嗎?否。
newb
為空。 - 提案:規格:類型推斷的通用方法,關於更改類型推理演算法更容易實現未來的增強
- 基於賦值上下文的推論,這取決於對上述提案的接受
僅此而已。編譯器不會根據函數傳回類型的使用方式推斷類型參數。
在撰寫本文時,正在討論的相關提案有:
以上是無法推斷函數建構函數的泛型參數中的類型的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

在函數繼承中,使用「基底類別指標」和「衍生類別指標」來理解繼承機制:基底類別指標指向派生類別物件時,執行向上轉型,只存取基底類別成員。派生類別指標指向基底類別物件時,執行向下轉型(不安全),必須謹慎使用。

Notepad++ 本身無法執行 C 語言程序,需要一個外部編譯器來編譯和執行程式碼。為了使用外部編譯器,可以按以下步驟進行設定:1. 下載並安裝C 語言編譯器;2. 在Notepad++ 中建立自訂工具,將編譯器執行檔路徑和參數配置好;3. 建立C 語言程式並儲存為.c 檔案副檔名;4. 選擇C 語言程式文件,從「執行」功能表中選擇自訂工具進行編譯;5. 查看編譯結果,輸出編譯錯誤或成功訊息。如果編譯成功,將產生可執行檔。

Java 中的 val 關鍵字用於聲明不可變的局部變量,即一旦賦值後無法更改其值。特點有:不可變性:一旦初始化,val 變數就不能重新賦值。局部作用域:val 變數僅在宣告它們的程式碼區塊內可見。類型推斷:Java 編譯器會根據賦值的表達式推斷 val 變數的型別。僅限局部變數:val 只能用於宣告局部變量,不能用於類別欄位或方法參數。

在 Sublime Text 中執行 Python 程式碼的快速鍵為:Windows 和 Linux: Ctrl + BMac: Cmd + B將遊標放置在程式碼中。按下快捷鍵。程式碼將使用系統預設的 Python 解釋器運行。

const 修飾符表示常數,值不可修改;static 修飾符指示變數的生存期和作用域。 const 修飾的資料成員在初始化後不可修改,static 修飾的變數在程式啟動時初始化,在程式結束時銷毀,即使沒有活動物件也會存在,並且可以跨函數存取。 const 修飾局部變數必須宣告時初始化,static 修飾的局部變數可以稍後初始化。 const 修飾類別成員變數必須在建構函式或初始化清單中初始化,static 修飾的類別成員變數可以在類別外部初始化。

Eclipse 中出現 "Error: Could not find or load main class" 錯誤的解決方法:檢查主類別是否存在並路徑正確。確認主類別位於正確的套件中,公共存取權限允許 Eclipse 存取。檢查類別路徑配置以確保 Eclipse 能夠找到主類別的類別檔案。編譯並修復導致無法載入主類別的錯誤。檢查堆疊追蹤以識別問題根源。使用 javac 命令從命令列編譯並檢查錯誤訊息。重新啟動 Eclipse 以解決潛在問題。

Eclipse 導覽列可透過下列方法顯示:透過選單:Window > Show View > Navigation快速鍵:Ctrl + 3 (Windows) 或Cmd + 3 (Mac)右鍵點選工作區> Show View > Navigation導覽列包含下列功能:專案資源瀏覽器:顯示資料夾和檔案包資源瀏覽器:顯示Java 包結構問題檢視:顯示編譯錯誤和警告任務檢視:顯示任務搜尋欄位:搜尋程式碼和檔案書籤檢視:標記程式碼行可供快速訪問

函數重載的限制包括:參數類型和順序必須不同(相同參數個數時),不能使用預設參數區分重載。此外,模板函數和非模板函數不能重載,不同模板規範的模板函數可以重載。值得注意的是,過度使用函數重載會影響可讀性和偵錯,編譯器從最具體到最不具體的函數進行搜尋以解決衝突。
