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

Java:泛型输入类型兼容性

邹英光
2023-03-14

我是一名java初学者,我正在阅读“Java初学者指南”这本书和泛型的主题。作者创建了以下泛型类:

// In this version of NumericFns, the type argument
// for T must be either Number, or a class derived
// from Number.
class NumericFns<T extends Number> {
    T num;
    // Pass the constructor a reference to
    // a numeric object.
    NumericFns(T n) {
        num = n;
    }

在这种情况下,类型参数必须是Number或Number的子类。

    // Return the reciprocal.
    double reciprocal() {
        return 1 / num.doubleValue();
    }
    // Return the fractional component.
    double fraction() {
        return num.doubleValue() - num.intValue();
    }
    // ...
}

作者说,如果我们添加一个新方法来检查存储在两个通用对象中的数值绝对值,如下所示:

// This won't work!
// Determine if the absolute values of two objects are the same.
boolean absEqual(NumericFns<T> ob) {
    if(Math.abs(num.doubleValue()) ==
            Math.abs(ob.num.doubleValue()) return true;
    return false;
}

用它写的解释是:

这里,使用标准方法Math.abs()获取每个数字的绝对值,然后进行数值比较,这种尝试的麻烦在于,它只会对类型与调用对象相同的其他NumericFns对象起作用,例如,如果调用对象的类型是NumericFns

我无法理解为什么它不能适用于所有不同的类型。请帮忙。


共有1个答案

朱兴安
2023-03-14

这是因为 T in absEqual(NumericFns

error: incompatible types: NumericFns<Double> cannot be converted to NumericFns<Integer>

相反,您可以使用:

// This will work!
// Determine if the absolute values of two objects are the same.
boolean absEqual(NumericFns<? extends Number> ob) {
    if( Math.abs(num.doubleValue()) ==
            Math.abs(ob.num.doubleValue()) ) return true;
    return false;
}

 类似资料:
  • 我定义jackoson序列化器并将其添加到java类中,如下所示: 编译器出现以下错误: 注释的定义为: 如果我从ReportFilterDeserializer中删除泛型attibute,它将通过编译。我不明白编辑为什么抱怨。

  • 我在抽象课上有以下内容... 还有另一个类,它继承了这个类... 当我从主类执行以下调用时,我收到一个错误... 我的问题是..为什么会发生这种情况?我的getEntityById不是返回T型的东西,在这种情况下应该是产品吗? 我在 Netbeans 中工作,编译时未显示任何错误。 感谢您的帮助=)

  • 和是的一部分,如下所示:

  • 问题内容: 我在写一些代码,遇到编译错误。这就是我所拥有的: 我以为使用继承时没有正确声明泛型,所以我检查了Oracle的教程,他们在其中编写 上面的声明使用相同的泛型类型,这是我在示例中要完成的工作。似乎假设from 与from 有所不同。否则,它应该能够 将 两者 合并并看到相同的类型。如何正确实现我要实现的目标? ( 即,某物的常量是某物的值,这是同一物的表达 ) 问题答案: 您的变量定义为

  • 在stackoverflow中还没有讨论的情况下,我遇到了“不兼容类型”编译器错误(例如,为什么这个通用java代码不能编译?)。 我的期望很简单--我调用的是一个模板化方法,它不使用包含类的任何“泛型”类,因此它应该从方法参数中提取模板参数的类型,并且在所有情况下都应该编译--但我得到了“不兼容类型”编译器错误。 我注意到解决这个问题的奇怪方法--在方法参数中向泛型datatype添加“<?ex

  • TypeScript里的类型兼容性是基于结构子类型的。 结构类型是一种只使用其成员来描述类型的方式。 它正好与名义(nominal)类型形成对比。(译者注:在基于名义类型的类型系统中,数据类型的兼容性或等价性是通过明确的声明和/或类型的名称来决定的。这与结构性类型系统不同,它是基于类型的组成结构,且不要求明确地声明。) 看下面的例子: interface Named { name: str