Generics 您可以使用抽象类来构造泛型吗?
我试图在泛型上使用构造函数,但由于泛型(在这里用T表示)可以是任何东西,我试图使T的类型为“RedClass”。如果我传递一个类来表示T,它也扩展了“RedClass”,我就可以在T上使用RedClass构造函数,对吗Generics 您可以使用抽象类来构造泛型吗?,generics,dart,constructor,Generics,Dart,Constructor,我试图在泛型上使用构造函数,但由于泛型(在这里用T表示)可以是任何东西,我试图使T的类型为“RedClass”。如果我传递一个类来表示T,它也扩展了“RedClass”,我就可以在T上使用RedClass构造函数,对吗 abstract class RedClass { RedClass(); RedClass.fromJson(Map<String, dynamic> json) } class BlueClass extends RedClass { BlueCl
abstract class RedClass {
RedClass();
RedClass.fromJson(Map<String, dynamic> json)
}
class BlueClass extends RedClass {
BlueClass();
}
class FinalClass<T extends RedClass> {
// Inside FinalClass I can create a BlueClass from the generic T
final happyBlueClass = T.fromJson(someJson)
}
// When creating the FinalClass i pass a class that also extends RedClass
return FinalClass<BlueClass>()
抽象类RedClass{
RedClass();
fromJson(映射json)
}
类BlueClass扩展了RedClass{
BlueClass();
}
最后一节课{
//在FinalClass中,我可以从泛型T创建一个BlueClass
final happyBlueClass=T.fromJson(someJson)
}
//在创建FinalClass时,我传递了一个也扩展了RedClass的类
返回最终类()
但是尝试这样做,泛型T似乎无法访问任何.fromJson()构造函数。
有什么想法吗?没有办法直接做你想做的事情 不能对类型变量调用静态方法,只能对实际声明它们的类/mixin/扩展调用静态方法。静态方法需要在编译时静态地知道,以便调用 如果要创建类型变量的实例,需要向类传递这样做的方法。也许:
class最终类{
最终T函数(动态)u来自JSON;
最终类(T函数(动态)fromJson):\u fromJson=fromJson;
void someMethod(someJson){
...
var happyBlueClass=\u fromJson(someJson);
...
}
}
谢谢大家的建议。我真的很感激
我现在的解决方案是尽可能使FinalClass的T通用,我需要使用widget树前面的提供者将构造函数传递给FinalClass
class FinalClassDataBuilder {
final Type model;
final Function builder;
FinalClassDataBuilder({this.model, this.builder});
}
class FinalClassProvider extends StatelessWidget {
final Widget child;
final List<FinalClassDataBuilder> modelbuilderList;
const FinalClassProvider({Key key, this.child, this.modelbuilderList})
: super(key: key);
@override
Widget build(BuildContext context) {
return Provider<List<FinalClassDataBuilder>>(
create: (_) => [...modelbuilderList],
child: child,
);
}
}
class FinalClass<T> {
...
final List<FinalClassDataBuilder> builders =
Provider.of<List<FinalClassDataBuilder>>(context);
final List<<FinalClassDataBuilder>> result = builders
.where((datamodel) => datamodel.model.toString() == T.toString())
.toList();
}
类FinalClassDataBuilder{
最终类型模型;
最终函数生成器;
FinalClassDataBuilder({this.model,this.builder});
}
类FinalClassProvider扩展了无状态小部件{
最后一个孩子;
最终列表模型构建者列表;
const FinalClassProvider({Key Key,this.child,this.modelbuilderList})
:super(key:key);
@凌驾
小部件构建(构建上下文){
返回提供者(
创建:()=>[…modelbuilderList],
孩子:孩子,
);
}
}
最后一节课{
...
最终列表生成器=
(上下文)的提供者;
最终列表结果=生成器
.where((datamodel)=>datamodel.model.toString()==T.toString())
.toList();
}
在FinalClass
T
内部,它不是一个可以在上面做事情的对象,而是一种类型。如果要在RedClass
的实例上调用实例方法,则必须创建RedClass
的实例,并将其传递到要从JSON调用的方法中,这在@Smutje是正确的,但在本例中,我正在寻找一种方法,在FinalClass内部创建BlueClass实例,而FinalClass对BlueClass一无所知。FinalClass
需要获取一个已构建的T
实例,或者需要获取一个构造并返回T
的回调。