我的代码中有以下课程
abstract class DatabaseKey<T> implements Built<DatabaseKey<T>, DatabaseKeyBuilder<T>> {
DatabaseKey._();
factory DatabaseKey([void Function(DatabaseKeyBuilder<T>) updates]) = _$DatabaseKey<T>;
String get name;
}
然后,我定义以下通用的typedef函数:
typedef ObserveDatabaseEntity = Observable<DatabaseEntity<T>> Function<T>(DatabaseKey<T> key);
但是,当我尝试按以下方式使用它时,代码有错误。
static ObserveConfigurationValue observe(
GetConfigurationState getState,
ObserveDatabaseEntity observeDatabaseEntity,
) {
assert(getState != null);
assert(observeDatabaseEntity != null);
return <KT>(ConfigKey<KT> key) {
return Observable.just(getState())
.flatMap((state) {
final dbKey = _databaseKeyFromConfig<KT>(key);
return observeDatabaseEntity(dbKey)
.map(_configValueFromDatabaseEntity);
});
}
}
DatabaseKey<T> _databaseKeyFromConfig<T>(ConfigKey<T> key) {
return DatabaseKey((build) => build
..name = key.value,
);
}
我得到的错误是:
不能将参数类型DatabaseKey分配给参数DatabaseKey。
我看不到这段代码有什么问题,或者为什么它不起作用,但是也许我对可以用Dart编写的内容的理解是错误的。如果可能的话,写这个的正确方法是什么?
EDIT#1:
注意:
typedef ObserveDatabaseEntity
在一个文件中
static ObserveConfigurationValue observe(GetConfigurationState getState, ObserveDatabaseEntity observeDatabaseEntity)
是另一个文件
从玩法来看,似乎将它们放在一个文件中,错误消失了。
仍然,我相信这也应该在单独的文件中起作用,
答案 0 :(得分:1)
此错误看起来像是导入不匹配。
在dart中,您可以通过相对路径或包导入文件。
merge(a, b, by=c("month", "site"))
merge(a, b, by=c("month", "site"), all=TRUE)
unique(a) %>%
merge(b, by=c("month", "site"), all =TRUE)
left_join(a, b, by=c("month", "site"))
right_join(a, b, by=c("month", "site"))
确实没有更好的方法,但是一旦选择了一种方法,就必须坚持下去。如果不这样做(这意味着您已经使用包导入方式导入了文件,并且使用相对路径在其他位置导入了相同文件),Dart会将它们放在两个不同的名称空间中,并认为它们是两个不同的类。