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

返回具有泛型类型的接口时出错

封烨伟
2023-03-14

我正在尝试返回一个对象,它应该是IClass的一个实现,具有一个通用类型,是IType的一个实现。

public IClass<IType> createClass()
{
    return new ActualClass();
}

我要返回的实际类扩展了Class (abstract ),其泛型类型为ActualType:

public class ActualClass extends Class<ActualType>

抽象类对象实现了IClass接口,可以有任何扩展IType的类型

public abstract class Class<T extends IType> implements IClass<T>

ActualType只是实现了IType接口

public final class ActualType implements IType

我在编译时得到一个“类型不匹配:无法从ActualClass转换为IClass”错误。我不明白为什么,既然ActualClass实现了IClass(间接通过Class),ActualType实现了IType。

如何重新排列它以使其正常工作?我做错了什么或误解了什么?

理想情况下,我仍然希望有一个接口IClass和IType,一个抽象实现类,然后是一个实际类,它扩展了抽象类并具有实现了IType的特定类型。

共有2个答案

齐向笛
2023-03-14

将< code>createClass的方法签名更改为:

public IClass<? extends IType> createClass() {
    return new ActualClass();
}

它不编译的原因是Java中的泛型不是隐式多态的,因此您必须明确表示该方法能够返回由IType的未知子集参数化的IClass

高运诚
2023-03-14

< code>ActualClass的层次结构如下:

IClass<ActualType>
       ^
       |
Class<ActualType>
       ^
       |
   ActualClass

所以,<code>IClass

因此,要么将方法的返回类型更改为<code>IClass

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

  • 问题内容: 对于一个抽象类,我想定义一个为子类返回“ this”的方法: 我希望能够执行以下操作: 可以说香蕉面包会抛出一个IllegalArgumentException消息“不是蛋糕!”。 问题答案: 编辑 要求子类以某种方式表现是没有问题的,这超出了静态类型可以检查的范围。我们一直在这样做-一页又一页的普通英语指定您如何编写子类。 提出的另一种具有协变返回类型的解决方案必须做同样的事情-用简

  • 问题内容: 我在接口上苦苦挣扎。考虑一下: 我希望函数返回a 或an ,具体取决于是否从或调用 当我尝试对此进行编译时,出现以下错误: 不能将s( StringGenerator类型)用作数组或切片文字中的Generator类型: StringGenerator不实现Generatorer(getValue方法的类型错误) 有getValue()字符串 要getValue() 我该如何实现? 问题

  • 我有一个问题,从抽象类中重写泛型方法。 这是我的抽象类: 当我创建类(B)来实现类(a)时,如下所示: 显示了(getData)方法中的以下编译错误: ”“B。getData“(“字符串函数(字符串)”不是“a”的有效重写。getData'('字符串函数(类型)‘)。dart(无效覆盖) 以及返回语句中的此错误: 类型为“String”的值不能从方法'getData'返回,因为它的返回类型为'St

  • 我有一个返回泛型的函数: 所以,当我试图匹配一个函数结果时,我的问题是: 我得到一个警告:“类型模式数组[CustomerInfo到[CustomerApplication到]]中的非变量类型参数CustomerApplication-DDTO未选中,因为它已被擦除消除。” 这是否意味着在Array[]中可以得到任何类型的数组?所以我已经阅读了关于ClassTag和TypeTag的文章,但是误解了

  • 我试图在静态编程语言中创建一个非常简单的泛型NDArray类,它将lambda表达式作为初始化函数。 典型的用法是: 我的问题是Kotlin编译器抱怨构造函数中值的初始化 通过说“不能使用‘T’作为具体化类型参数。改用类”。为什么? 编辑: 如果我用我自己的MyArray替换静态编程语言Array实现,它会编译: 不确定为什么静态编程语言对待MyArray与常规数组不同,当两者具有相同的构造函数时