Scala导入有问题。我有两个类的导入问题。第一个:
package org.world
import org.gui.tokens.Token
object WorldObject {
}
abstract class WorldObject[A <: WorldObject[_]](var xPos: Float, var yPos: Float) {
def x = xPos
def y = yPos
def token: Token
^^^^^
def move(dx: Float, dy: Float) {// : A = new A(x + dx, y + dy)
xPos += dx // = x + dx
yPos += dy
}
}
和第二个:
package org.gui.tokens
object Token {
}
问题是def token: Token
的返回类型用红色加下划线,错误说
未找到:键入令牌
课程地点一切都很好。其他课程没有类似的问题。我不记得Java中的这种情况,autoimport总能完美运行。这里只是一遍又一遍地在import org.gui.tokens.Token
文件中重复添加WorldObject
语句......为什么会这样?我该怎么办呢?
答案 0 :(得分:7)
Token
是一个对象,所以说def token: Token
对编译器的意义与def token: 5
或def token: "Hello"
有关。
如果要返回def token = Token
对象,则表示Token
;或者你的标记文件中是class Token {}; object Token extends Token {}
,所以确实有一个名为Token
的类,或者你的意思是def token: Token.type
,这意味着该方法必须返回某种类型的对象 Token
。 (但没有多大意义,因为对象Token
是唯一具有Token.type
类型的东西。)
答案 1 :(得分:2)
首先,'用红色加下划线'意味着你要问Scala的特定IDE(Eclipse,IDEA?)。
object Token
是一个单例对象,没有可以实例化的通用类型Token
!只有一个对象,因此def token: Token
错误地暗示可能存在不同的令牌。您可以通过两种方式纠正此问题。首先使用单Token
类型:
def token: Token.type
或者,因为只有一种方法可以返回这样的对象,所以你已经可以提供实现了:
def token: Token.type = Token
或短
def token = Token
但是,这一点的用处值得怀疑。任何寻找对象Token
的人都可以直接与它交谈,而不是间接方法。
答案 2 :(得分:1)
您的问题不在于包,而在于对象。
您将Token标记为对象而不是类。这类似于将Java类中的每个方法都标记为静态,但在Scala中,没有机会进行声明。
package org.gui.tokens
class Token {
}
请记住,因为对象只有一个实例且无法扩展,所以它们不能用作标识符。