我在下面的代码中收到错误“无法将参数类型‘字符串’分配给参数类型‘字符串’”:
import 'dart:async';
abstract class SettingsBase {
Future<String> getSetting<String>(String key);
Future saveSetting<String>(String key, String value);
}
class InMemorySetting extends SettingsBase {
final settings = <String, String>{};
@override
Future<String> getSetting<String>(String key) {
if (settings.containsKey(key)) {
return Future.value(settings[key] as String);
}
if (key == "theme") {
return Future.value("light" as String);
}
throw UnimplementedError();
}
@override
Future saveSetting<String>(String key, String value) {
settings.putIfAbsent(key, () => value);
return Future.value(true);
}
}
我错过了什么?
答案 0 :(得分:2)
阅读一些关于 generic 是什么的书。
我不知道为什么,但是您在抽象类中为函数原型添加了一个泛型,名称为 String
。所以 key
和 value
参数的类型是泛型类型,只是占位符名称为 String
。
删除那些泛型:
import 'dart:async';
abstract class SettingsBase {
Future<String> getSetting(String key);
Future saveSetting(String key, String value);
}
class InMemorySetting extends SettingsBase {
final settings = <String, String>{};
@override
Future<String> getSetting(String key) {
if (settings.containsKey(key)) {
return Future.value(settings[key] as String);
}
if (key == "theme") {
return Future.value("light" as String);
}
throw UnimplementedError();
}
@override
Future saveSetting(String key, String value) {
settings.putIfAbsent(key, () => value);
return Future.value(true);
}
}
答案 1 :(得分:1)
您正在使用覆盖 Dart 的 String 类型的通用 String 类型。
删除多余的字符串
getSetting<String>
答案 2 :(得分:0)
事实证明,我在方法中添加了一个名为 String
的额外泛型类型参数。下面的代码有效。
import 'dart:async';
abstract class SettingsBase {
Future<String> getSetting<String>(String key);
Future saveSetting(String key, String value);
}
class InMemorySetting extends SettingsBase {
final settings = <String, String>{};
@override
Future<String> getSetting<String>(String key) {
if (settings.containsKey(key)) {
return Future.value(settings[key] as String);
}
if (key == "theme") {
return Future.value("light" as String);
}
throw UnimplementedError();
}
@override
Future saveSetting(String key, String value) {
settings.putIfAbsent(key, () => value);
return Future.value(true);
}
}