簡體   English   中英

Dart:不覆蓋泛型方法具有類似於返回類型的泛型參數類型

[英]Dart: doesn't override generic method has generic parameter type similar to the return type

我有一個從抽象 class 覆蓋泛型方法的問題。

這是我的抽象 class:

abstract class A {
  String getData<Type>(Type key);
}

當我創建一個 class (B) 來實現 class (A) 時,如下所示:

class B implements A {
  @override
  String getData<String>(String key) {     //Error <= B.getData' ('String Function<String>(String)') isn't a valid override of 'A.getData' ('String Function<Type>(Type)')

    return "";
  }
}

在 (getData) 方法中顯示以下編譯錯誤:

'B.getData' ('String Function(String)') 不是 'A.getData' ('String Function(Type)') 的有效覆蓋。 飛鏢(無效覆蓋)

return 語句中的這個錯誤:

無法從方法“getData”返回“String”類型的值,因為它的返回類型為“String”。

當泛型類型類似於返回類型時,為什么我會收到與覆蓋相關的錯誤,這讓我感到困惑。 當我用getData<int>(int key)而不是getData<String>(String key)創建另一個 class (C) 時,一切都按預期工作:

class C implements A {
  @override
  String getData<int>(int key) {

    return "";
  }
}

同樣使用 class (B) 如果我刪除了返回類型,如下所示,一切都會按預期工作:

class B implements A {

  @override
  getData<String>(String key) {

     return "";
  }
}

這是 Dart 設計中的問題,所以我可以知道它,因為這種行為在 c# 語言中不存在?

DartPad 鏈接: https://dartpad.dev/ebc7e6361d0cf1c6afad2f52ab8ebcaa

您編寫的第一個方法是對名為Type的類型參數的泛型,並具有返回類型String 也就是說,它是 function ,對於任何類型的Type返回String類型的東西。

第二種方法是對名為String的類型參數的泛型,並返回類型參數類型的某些內容。 類型參數名為String的事實使您看起來在第一個方法和第二個方法中具有相同的返回類型,但您沒有。 第一種方法有一個返回String 第二種方法的返回類型為“剛剛引入的類型變量,名稱為String ”。 這兩種類型不相關,因此覆蓋無效。 如果將第二種方法中的類型變量重命名為T ,則會得到以下等效方法:

class B implements A {
  @override
  T getData<T>(T key) {
    return "";
  }
}

現在應該清楚為什么您的覆蓋無效。

方法簽名

String getData<Type>(Type key);

更典型的是用T而不是Type來寫,因為Type已經有一個含義

String getData<T>(T key);

此簽名用於允許為T填寫任何類型的方法。 這意味着每個子類都必須有一個允許任何類型T的方法。

我懷疑您想要的是將子類專門用於單個泛型類型 - 在這種情況下,您希望將泛型從方法級別移動到 class 級別。

abstract class A<T> {
  String getData(T key);
}

class B implements A<String> {
  @override
  String getData(String key) => '';
}

class C implements A<int> {
  @override
  String getData(int key) => '';
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM