当前位置: 首页 > 面试题库 >

Java类中的Scala获取器和设置器

廖令
2023-03-14
问题内容

我想创建一个遵循Scala setters / getters约定的Java类。

我尝试了以下简单的课程,但它不起作用:

public class JavaA {
private int a = 0;

public int a() {
    return a;
}

public void a_$eq(int a) {
    this.a = a;
}
}

但是,当我尝试从scala访问它时:

val x = new JavaA
x.a = 1

并且我收到“向val重新分配”的错误消息。我试图寻找这个问题,但是所有问题都从scala到Java出现了。

正确的做法是什么?

谢谢!


问题答案:

您只能这样做,而且您可能不想这样做已经足够困难。

不能
做的是编写一个裸露的Java类,该类被神奇地解释为Scala获取器和设置器。原因是Scala将信息嵌入其getter和setter所需的类文件中(例如,是否存在零个参数块或一个空的参数块-
JVM(或Java)中没有保留这种区别)。

可以 使用Java来实现Scala定义的接口(即特征):

// GetSetA.scala
trait GetSetA { def a: Int; def a_=(a: Int): Unit }

// JavaUsesGSA.java
public class JavaUsesGSA implements GetSetA {
  private int a = 0;
  public int a() { return a; }
  public void a_$eq(int a) { this.a = a; }
}

即使如此,您 仍然无法 做的是直接使用该类(同样,因为Java并未为Scala添加适当的注释信息):

scala> j.a = 5
<console>:8: error: reassignment to val
       j.a = 5

但是由于它 确实 成功实现了特征,因此在将其键入为特征时可以根据需要使用它:

scala> (j: GetSetA).a = 5
(j: GetSetA).a: Int = 5

所以这真是个混蛋。无论如何,它都不是完美的,但是在某些情况下,它可能足以提供帮助。

(当然,另一种选择是提供从Java类到具有getter / setter的隐式转换,该getter /
setter引用Java类上的真实方法;即使您无法从Scala继承Java,此方法也可以使用)

(编辑:当然,没有绝对的理由要求编译器 必须 采取这种方式;有人可能会认为,将Java定义的getter /
setter对解释为Scala对(即,如果类文件未明确表示它来自Scala)是一种是增强功能以​​改善Java互操作性的理想选择。)



 类似资料:
  • 问题内容: 我将如何使用Java的ArrayList的getter和setter方法?这就是我所拥有的。我认为我正确地使用了吸气剂,但是我不知道如何为ArrayList使用setter。 问题答案: 要设置值,您可以将pass作为参数,只需将设置为参数即可。 另外,请注意使用而不是问题中所显示的。通常,setter方法不返回任何内容。

  • 我正在为函数表达式编写提取器对象。下面是它的样子: 我可以摘录如下: 但这并不像它可能的那样可爱。我想有这样的东西: 就像咖喱榨汁机。所以我尝试了这个: 但它没有工作: 有办法在Scala中做到这一点吗?

  • 问题内容: 我需要知道如何让NetBeans使用快捷方式生成getter和setter。 问题答案: 将光标放在班级内部,然后按+ 并从上下文菜单中选择。

  • 本文向大家介绍Java获取和设置字段,包括了Java获取和设置字段的使用技巧和注意事项,需要的朋友参考一下 示例 使用Reflection API,可以在运行时更改或获取字段的值。例如,您可以在API中使用它,以根据某个因素(例如操作系统)来检索不同的字段。您也可以删除修饰符,例如final允许修饰最终的字段。 为此,您将需要以getField()如下所示的方式使用Class#方法: 获取字段要容

  • 如何在TypeORM中使用getter和setter。 我在这里和这里都看到了问题,但没有找到答案 例如,离开我的用户实体 我使用的是类型ORM版本 0.2.7

  • 问题内容: 我正在编写Java代码,其中需要调用这样定义的Scala函数: 在Scala中,我将简单地调用func String Java代码应类似于:func(“ a”,arg1,arg2),其中arg1是TypeTag ,而arg2是ClassTag 我不确定如何在Java中生成arg1和arg2 问题答案: 您要针对通用对象还是特定对象?对于泛型,没有办法做到,而是接受和作为参数(就像Sca