Heim  >  Artikel  >  Backend-Entwicklung  >  Die Typzusicherung kann nicht für den Typparameterwert verwendet werden

Die Typzusicherung kann nicht für den Typparameterwert verwendet werden

PHPz
PHPznach vorne
2024-02-09 21:42:09674Durchsuche

Die Typzusicherung kann nicht für den Typparameterwert verwendet werden

In der PHP-Programmierung ist die Typzusicherung eine gängige Technik zur Bestimmung des Typs einer Variablen. Manchmal kann jedoch ein Problem auftreten: Typzusicherungen können nicht für Typparameterwerte verwendet werden. Diese Frage könnte einige Entwickler verwirren. In diesem Artikel werden wir die Ursachen dieses Problems untersuchen und einige Lösungen anbieten. Unabhängig davon, ob wir Anfänger oder erfahrene Entwickler sind, können wir Typzusicherungen besser verstehen und verwenden, indem wir dieses Problem verstehen und lösen. Lass uns einen Blick darauf werfen!

Frageninhalt

Wir können keine Typzusicherungen für generische Typvariablen verwenden. Dies scheint seltsam, wenn man bedenkt, dass es sich um das generische Verhalten der interface{} 允许的,但不受 interface{}-Einschränkung handelt. Sie fragen sich, ob es Workarounds gibt?

// This works
func isInt(x interface{}) bool {
    _, ok := x.(int)
    return ok;
}

// Compile Error
// invalid operation: cannot use type assertion on type parameter 
// value x (variable of type T constrained by interface{})
func isInt2[T interface{}](x T) bool {
    _, ok := x.(int)
    return ok;
}

Lösung

tl;dr

Sie können Typzusicherungen nur für Schnittstellenwerte durchführen. Daher müssen Sie zunächst x 转换为有效的接口类型,在本例中为 any / interface{} umrechnen:

func isint[t any](x t) (ok bool) {

    _, ok = any(x).(int) // convert, then assert
    return
}

Warum schlägt dieses Kompilieren fehl?

_, ok = x.(int)   // ... cannot use type assertion on type parameter value ...

x 的类型 t 是一个类型参数,而不是一个接口。它仅受接口约束。 go(修订版 1.18) Die Sprachspezifikation besagt eindeutig, dass Typparameter in Typzusicherungen nicht zulässig sind:

Für Schnittstellentyp, aber nicht für Typausdruck x Die Parameter und der Typ t ...符号 x.(t) werden Typzusicherungen genannt.

Außerdem erfahren Sie im Generics Tutorial, warum Parametertypen zur Kompilierungszeit aufgelöst werden müssen:

Obwohl Einschränkungen für Typparameter normalerweise eine Reihe von darstellen Typ, zur Kompilierungszeit stellt der Typparameter einen einzelnen Typ dar – Der vom aufrufenden Code als Typparameter bereitgestellte Typ. wenn Typ Der Typ des Parameters ist durch die Einschränkungen des Typparameters nicht zulässig. Der Code kann nicht kompiliert werden.

Das obige ist der detaillierte Inhalt vonDie Typzusicherung kann nicht für den Typparameterwert verwendet werden. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen