Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Generics 您可以使用抽象类来构造泛型吗?_Generics_Dart_Constructor - Fatal编程技术网

Generics 您可以使用抽象类来构造泛型吗?

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

我试图在泛型上使用构造函数,但由于泛型(在这里用T表示)可以是任何东西,我试图使T的类型为“RedClass”。如果我传递一个类来表示T,它也扩展了“RedClass”,我就可以在T上使用RedClass构造函数,对吗

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
的回调。