我有一個抽象基類驗證器,它帶有一個將泛型型別作為引數的方法。我將從繼承基類的子類將泛型型別引數傳遞給基類。
基類:
abstract class BaseValidator {
bool isValid<T>(T obj);
}
兒童班:
class IPv4Validator extends BaseValidator{
final IPV4_REGEX = "^((25[0-5]|(2[0-4]|1d|[1-9]|)d).?\b){4}\$";
@override
bool isValid<String>(String obj) {
bool hasMatch = RegExp(IPV4_REGEX).hasMatch(obj);
return hasMatch;
}
}
這里hasMatch接受不可為空的字串。當我直接傳遞一些字串時,hasMatch 不會拋出錯誤。但是當我嘗試在方法引數中傳遞通用值時,它顯示錯誤。
不能將引數型別“String”分配給引數型別“String”。
我無法理解為什么泛型型別不接受,即使它是編譯時型別。

uj5u.com熱心網友回復:
下面的代碼解決了這個特殊問題。但它可能與您打算實施的有所不同。另一方面,如果您為不同的資料型別創建一個新的具體類,代碼會更清晰。
abstract class BaseValidator<T> {
bool isValid(T obj);
}
class IPv4Validator extends BaseValidator<String>{
final IPV4_REGEX = "^((25[0-5]|(2[0-4]|1d|[1-9]|)d).?\b){4}\$";
@override
bool isValid(String obj) {
bool hasMatch = RegExp(IPV4_REGEX).hasMatch(obj);
return hasMatch;
}
}
解釋。
在class IPv4Validator extends BaseValidator<String>我們沒有宣告新類的行中BaseValidator,它已經被宣告為BaseValidator<T>。這里我們繼承了現有泛型類的特化BaseValidator。在行bool isValid<String>(String obj)中,我們宣告了一個新函式,因此編譯器將其理解為就好像我們宣告了一個引數型別為 的新泛型函式一樣String。所以,這里bool isValid<String>(String obj)相當于 bool isValid<T>(T obj),只是T我們使用 name而不是 name String,它不是一個物件String。
uj5u.com熱心網友回復:
您可以做的另一個修復是使用covariant關鍵字來實作它,試試這個:
abstract class BaseValidator<T> {
bool isValid(T obj);
}
class IPv4Validator extends BaseValidator {
final IPV4_REGEX = "^((25[0-5]|(2[0-4]|1d|[1-9]|)d).?\b){4}\$";
@override
bool isValid(covariant String obj) {
bool hasMatch = RegExp(IPV4_REGEX).hasMatch(obj);
return hasMatch;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/537057.html
標籤:扑镖仿制药通用方法
下一篇:型別“T”上不存在屬性“建構式”
