【问题标题】:Not able to create object of desired type in java无法在 java 中创建所需类型的对象
【发布时间】:2021-08-24 07:18:02
【问题描述】:

我正在使用 deequ 来编写分析器。我的编辑正在向我显示此警告,但我不确定如何解决此警告。

在线这个:

Analyzer analyzer = new PatternMatch("email", Patterns.EMAIL(), option);

我在 IntelliJ 中收到此警告。

Raw use of parameterized class 'Analyzer' 

我收到将Analyzer 更改为Analyzer<NumMatchesAndCount, DoubleMetric> 的建议。当我这样做时,此警告已解决,但是,在这样做时,我在以下行中收到错误:

AnalysisRunBuilder analysisBuilder = AnalysisRunner.onData(table);
analysisBuilder.addAnalyzer(analyzer);

我得到的错误:

Required type:    Analyzer<?,Metric<?>>
Provided:         Analyzer<NumMatchesAndCount, DoubleMetric>

DoubleMetric 也实现了 Metric 接口 (public class DoubleMetric implements Metric, Product, Serializable),所以我认为我们不应该得到上述错误。我说的对吗?

上面行中addAnalyzer函数的签名是:

public AnalysisRunBuilder addAnalyzer(Analyzer analyzer) {
      this.analyzers_$eq((Seq)this.analyzers().$colon$plus(analyzer, .MODULE$.canBuildFrom()));
      return this;
   }

我的疑问是,当函数的签名不期望参数化类 Analyzer 时,为什么我会收到预期类型为 Analyzer&lt;?,Metric&lt;?&gt;&gt; 的警告?

我的目标是找出如何准确地使用上述addAnalyzer 函数?在这个函数中,我想传递一个PatternMatch 类的实例。该类实现如下:PatternMatch扩展抽象类StandardScanShareableAnalyzer实现接口ScanShareableAnalyzer,后者又扩展Analyzer类。

【问题讨论】:

  • 您使用的是哪个编辑器?您是否也尝试过从命令行编译?
  • @TimMoore 我正在使用 IntelliJ 想法。我尝试运行 mvn clean install,它成功构建了一个 jar 文件,但在编译时显示了类似的警告
  • 感谢您的快速回复。我在下面发布了一个答案,但我将使用 IntelliJ IDEA 的特定信息对其进行更新。

标签: java java-8 amazon-deequ


【解决方案1】:

Deequ 是一个用 Scala 编写的库。虽然通常可以从 Java 代码中使用 Scala 库,但并不总是那么简单。

上面的addAnalyzer 方法的代码看起来像是从字节码反编译器生成的。由于generics type erasure,编译字节码中的方法签名会丢失其原始类型参数。但是,类型参数信息包含在字节码的元数据中,允许编译器检查调用。虽然原则上可以在反编译器中重构原始类型(请参阅Is it possible to decompile Java bytecode back to original generic type parameters),但在这种情况下似乎没有。

AnalysisRunBuilder 的实际原始 (Scala) 源代码定义 addAnalyzer 如下:

def addAnalyzer(analyzer: Analyzer[_, Metric[_]]): this.type = {
  analyzers :+= analyzer
  this
}

在 Scala 中,参数声明的语法采用以下形式:name: Type。类型参数使用方括号而不是尖括号。通配符使用下划线而不是问号。此方法签名等价于 Java 语法中的此签名:

public AnalysisRunBuilder addAnalyser(Analyzer<?, Metric<?>> analyzer)

与错误信息指示的完全一样。

但是,DoubleMetric 的定义表明它是extends Metric[Double]。我希望问题中的代码能够成功编译。一些 Java IDE 难以检查与 Java 源代码和 Scala 库的兼容性。在 IntelliJ IDEA 中,安装官方 Scala plugin 解决了许多此类错误错误的问题。在大多数情况下,使用命令行 javac 编译器(或调用它的构建工具,如 Maven)可以避免这些问题。

【讨论】:

  • 感谢您的回答。我已经安装了 scala 插件,但它对编辑器警告没有帮助。所以,我猜编辑器有问题
  • 值得向 JetBrains 报告。他们擅长修复这种错误错误。
猜你喜欢
  • 2019-09-08
  • 2020-11-09
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-28
相关资源
最近更新 更多