【问题标题】:Create companion objects for classes imported from Java为从 Java 导入的类创建伴随对象
【发布时间】:2014-09-04 09:11:01
【问题描述】:

我想为一些导入的 Java 类型创建伴随对象,这样我就不必使用 new 来分配它们。我想从从 jMonkeyEngine 的 com.jme3.math 导入的 Vector3f 类型开始。

我尝试的是:

package com.jme3.math

object Vector3f {
  def apply() = new Vector3f()
  def apply(x:Float, y:Float, z:Float) = new Vector3f(x,y,z)
}

编译时出现错误:

错误:(8, 21) 未找到:类型 Vector3f def apply() = new Vector3f()

当我添加 import com.jme3.math.Vector3f 时,我收到警告,这可能解释了我所看到的:

警告:(3, 22) 导入的 `Vector3f' 被数学包中 Vector3f 对象的定义永久隐藏

如何为 com.jme3.math.Vector3f 或从 Java 导入的其他类型创建伴随对象?

【问题讨论】:

标签: scala import companion-object


【解决方案1】:

这是一个命名问题,您不能在其中同时拥有同名的 Java 类和 Scala 伴生对象。

您可以使用完全限定名称 new com.jme3.math.Vector3f(...) 访问伴随对象内的 Java 类,或者在导入时指定不同的本地名称。

import com.jme3.math.{ Vector3f => JV3 }

def apply(): JV3 = new JV3()

额外示例(Java 类org.apache.http.HttpClient 的伴随对象):

import org.apache.http.client.{ HttpClient ⇒ HC }

object HttpClient {
  def apply(): HC = ???
}

或者……

// No import
object HttpClient {
  def apply(): org.apache.http.client.HttpClient = ???
}

【讨论】:

  • 我已经尝试“使用完全限定名称 new com.jme3.math.Vector3f 访问伴随对象内的 Java 类”,但这仍然给我错误:“类型 Vector3f 不是包 com 的成员.jme3.math”。我想我可能不应该使用与我正在导入的 Java 相同的包名? ^
  • 你不应该用相同的包名定义你的伴生对象。首先,这会产生技术问题,然后必须在此包中定义原始 Java lib 的类,以尊重作者和责任的区别。
  • 当我使用不同的包名时,它会起作用。没有错误,但有警告“导入的 `Vector3f' 被包树中对象 Vector3f 的定义永久隐藏”。但是没有错误,尽管有警告 Vector3f 似乎工作正常,即使在伴随对象本身也不需要指定 com.jme3.math,我可以使用 = new Vector3f。奇怪。
  • 我现在不知道如何处理这个问题。似乎使用包的名称是一个非常重要的错误,它使剩下的问题变得毫无意义。但是,如果我编辑问题以使用不同的包名称,问题会发生很大变化(现在只是关于警告),并且您的回复大部分都会过时。
  • 此警告意味着您导入了一个名称对应于 Scala 代码中的类或对象的类。你不应该在同一个包中定义你的代码,也不应该使用冲突的名称(通过在 import 语句中重命名,或者使用 FQDN 类名没有 import)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多