Heim  >  Artikel  >  Backend-Entwicklung  >  Es können keine Typen in generischen Parametern des Funktionskonstruktors abgeleitet werden

Es können keine Typen in generischen Parametern des Funktionskonstruktors abgeleitet werden

PHPz
PHPznach vorne
2024-02-09 08:00:32581Durchsuche

Es können keine Typen in generischen Parametern des Funktionskonstruktors abgeleitet werden

php-Editor Youzi wird eine für alle häufig gestellte Frage beantworten: den Grund, warum der Typ nicht aus den generischen Parametern des Konstruktors abgeleitet werden kann. In PHP wird die Typinferenz für generische Parameter durch den Standardwert des Parameters erreicht. Da die Parameter im Konstruktor jedoch vor der Erstellung des Objekts übergeben werden, kann der Typ der Parameter nicht aus der Instanz des Objekts abgeleitet werden. Dies führt dazu, dass der Typ des generischen Parameters im Konstruktor nicht abgeleitet werden kann und der Typ manuell angegeben werden muss, um dieses Problem zu lösen.

Frageninhalt

Ich habe generischen Code in Go, in dem ich einen „Master“-Typ mit einem generischen Parameter und viele „Slave“-Typen habe, die dieselben generischen Parameter haben sollten. Der Code sieht etwa so aus:

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
}

Grundsätzlich sollte der Benutzer in a 上定义 t ,然后 b 上的 t 应该是相同的。此类代码可以在支持泛型的其他语言中工作,但在 go 中,我在注释行处收到 cannot infer t 编译错误(请参阅此处的 go playground 代码)。在我看来, a 上的类型参数设置为 int ,因此 b 上的类型参数也应设置为 int 。我可以改为调用 newb[int]() sein, aber das erscheint mir zu ausführlich. Warum passiert das?

Problemumgehung

Dies ist eine Variation von „Warum kann der Compiler die Typparameter nicht basierend auf der Verwendung des Rückgabetyps ableiten?“ Antwort: Denn ab Go 1.20 funktioniert die Typinferenz nicht mehr auf diese Weise.

TypinferenzGilt für:

  • Typparameterliste
  • Ersatzkarte m mit bekannten Typparametern initialisiert (falls vorhanden)
  • Eine (möglicherweise leere) Liste normaler Funktionsargumente (nur bei Funktionsaufrufen)

Wenn Sie diese Regeln einzeln überprüfen:

  • newb() Gibt es eine Typparameterliste? NEIN. Sie rufen es auf, ohne einen Typparameter anzugeben.

  • Gibt es andere bekannte Typparameter, mit denen auf andere Typparameter geschlossen werden kann? Nein, Sie haben überhaupt keine Typparameter angegeben. Beachten Sie, dass dieser Fall für Funktionsaufrufe gilt, bei denen Sie eine Teilanzahl von Typparametern angeben, zum Beispiel:

    func foo[T any, U *T]() {}

    On top kann man nur t,例如float64,编译器将使用 t -> float64 构造替换映射,然后推断 u -> *float64

    bereitstellen
  • Gibt es abschließend eine Liste normaler Funktionsparameter? NEIN. newb ist leer.

Das ist alles. Der Compiler leitet keine Typparameter basierend auf der Verwendung des Rückgabetyps der Funktion ab.

Zum Zeitpunkt des Verfassens dieses Artikels werden folgende relevante Vorschläge diskutiert:

Das obige ist der detaillierte Inhalt vonEs können keine Typen in generischen Parametern des Funktionskonstruktors abgeleitet 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