当前位置: 首页 > 知识库问答 >
问题:

Dart:不覆盖泛型方法具有类似于返回类型的泛型参数类型

段干兴业
2023-03-14

我有一个问题,从抽象类中重写泛型方法。

这是我的抽象类:

abstract class A {
  String getData<Type>(Type key);
}

当我创建类(B)来实现类(a)时,如下所示:

class B implements A {
  @override
  String getData<String>(String key) {     //Error <= B.getData' ('String Function<String>(String)') isn't a valid override of 'A.getData' ('String Function<Type>(Type)')

    return "";
  }
}

显示了(getData)方法中的以下编译错误:

”“B。getData“(“字符串函数(字符串)”不是“a”的有效重写。getData'('字符串函数(类型)‘)。dart(无效覆盖)

以及返回语句中的此错误:

类型为“String”的值不能从方法'getData'返回,因为它的返回类型为'String'。

这让我感到困惑的是,为什么当泛型类型类似于返回类型时,我会收到与重写相关的错误。就像我用获取数据创建另一个类(C)一样

class C implements A {
  @override
  String getData<int>(int key) {

    return "";
  }
}

同样对于类(B),如果我删除了返回类型,如下所示,则一切都将按预期工作:

class B implements A {

  @override
  getData<String>(String key) {

     return "";
  }
}

这是否是Dart设计中的问题,所以我可以意识到它,因为这种行为在c#语言中不存在?

DartPad链接:https://dartpad.dev/ebc7e6361d0cf1c6afad2f52ab8ebcaa


共有2个答案

狄兴邦
2023-03-14

方法签名

String getData<Type>(Type key);

通常使用T而不是Type编写,因为Type已经有了意义。

String getData<T>(T key);

此签名用于允许为T填充任何类型的方法。这意味着每个子类都必须有一个允许任何类型T的方法。

我怀疑您想要的是将子类专门化为单个泛型类型——在这种情况下,您想要将泛型从方法级别移动到类级别。

abstract class A<T> {
  String getData(T key);
}

class B implements A<String> {
  @override
  String getData(String key) => '';
}

class C implements A<int> {
  @override
  String getData(int key) => '';
}
时向文
2023-03-14

您编写的第一个方法在名为<code>type。也就是说,它是一个函数,对于任何类型type都返回类型为String

第二种方法是对名为 String 的类型参数的泛型,并返回类型参数类型的内容。类型参数名为 String 的事实使它看起来像您在第一个方法和第二个方法中具有相同的返回类型,但您没有。第一个方法返回到 String。第二个方法的返回类型为“刚刚引入的类型变量,名为 String”。这两种类型是不相关的,因此重写是无效的。如果将第二种方法中的类型变量重命名为 T,则将获得以下等效方法:

class B implements A {
  @override
  T getData<T>(T key) {
    return "";
  }
}

现在应该清楚为什么您的覆盖无效。

 类似资料:
  • 我在覆盖接口中声明的方法时遇到了一些问题,该方法使用泛型参数作为其异常,并使用泛型作为其参数之一。为了说明,我编写了以下代码接口 通过javac运行,我得到 请注意,在接口中,metodoA和metodoB之间的唯一区别在于它们的参数。 为什么Implementadora(Implementadora)的metodoB(metodoB)(代码)不重写Interfaz(代码),但重写metodoB(

  • 问题内容: 背景 我曾经写过这种方法: 应该这样称呼它: 这很好用(尽管我在研究当前容易出错的问题时在这里的答案中已经看到)。 目前的情况 无论如何,现在我正在编写以下代码(在扩展javax.servlet.jsp.tagext.TagSupport的类中): 目的是可以这样称呼: 我的评估方法中的代码显然不起作用。的第二个参数应该是Class对象。这导致我: 我的问题 如何获得通用(返回)类型的

  • 我试图创建一个Java方法,它接受一个对象类型和它应该转换成的数据类型。 例如,如果我应该能够返回一个值1作为Int或双根据需要。我使用类传递数据类型作为参数。 问题:如何使方法泛型以接受基于输入参数的返回类型? 下面的代码只是一个示例,它可能在语法上不正确,用于解释我的问题。

  • (沙盒) 获取此错误: 类型“number”不可分配给类型“T”“number”可分配给“T”类型的约束,但“T”可以用约束{}的不同子类型实例化。(2322)输入。ts(1,26):预期类型来自此签名的返回类型。 我希望typescript能够自动推断T为数字,然后直接使用它。为什么它在抱怨?写这样的东西的正确方法是什么?谢谢

  • 问题内容: 我偶然发现了对Java继承的好奇心,我希望您对此提出更好的想法: 假设两个接口A和A1 接口A1扩展了A 接口A具有返回泛型类型的方法。 通用类型将是。 现在的基本思想是将这种通用返回类型从接口A中更改 为 接口A1中的 一开始似乎很容易(不好的事情会在以后出现) 我们将接口A声明为 和接口A1一样 如您所见,我们被迫编写接口A本身,以允许使用基于泛型的“子类”覆盖它。(实际上,gen

  • Java中是否有一种方法可以通过一个方法的声明返回不同的类型? 我希望此方法返回一个对象,并在函数调用时将其转换为正确的类型。这就是我的想法,但它不是这样工作的。我是否需要某种通用返回类型来执行此操作?解决这个问题的最佳方法是什么?