gpt4 book ai didi

scala - 如何解决 "Implementation restriction: trait ... accesses protected method ... inside a concrete trait method."

转载 作者:行者123 更新时间:2023-12-04 14:02:02 25 4
gpt4 key购买 nike

我正在使用的 Java 库类声明

protected getPage(): Page { ... }

现在我想制作一个辅助 Scala mixin 来添加我经常使用的功能。我不想扩展这个类,因为 Java 类有不同的子类,我想在不同的地方扩展。问题是,如果我使用 getPage()在我的混合中 trait ,我收到此错误:

Implementation restriction: trait MyMixin accesses protected method getPage inside a concrete trait method.



有没有办法让它工作而不影响我的子类? 为什么会有这个限制?

到目前为止,我想出了一个解决方法:我将特征中的方法覆盖为
override def getPage(): Page = super.getPage();

这似乎有效,但我并不完全满意。幸运的是我不需要覆盖 getPage()在我的子类中,但如果我需要,我会得到相同方法的两个覆盖,并且这种变通方法不起作用。

最佳答案

问题是,即使 trait 扩展了 Java 类,实现实际上并不是在扩展 Java 类的东西中。考虑

class A { def f = "foo" }
trait T extends A { def g = f + "bar" }
class B extends T { def h = g + "baz" }

B 的实际字节码中我们看
public java.lang.String g();
Code:
0: aload_0
1: invokestatic #17; //Method T$class.g:(LT;)Ljava/lang/String;
4: areturn

这意味着它只是转发到名为 T$class 的东西,事实证明是
public abstract class T$class extends java.lang.Object{
public static java.lang.String g(T);
Code:
...

所以代码的主体不是从 A 的子类调用的根本。

现在,有了 Scala 就没有问题了,因为它只是省略了 protected来自字节码的标志。但是 Java强制只有子类可以调用 protected 方法。

因此,您遇到了问题和信息。

您无法轻松解决此问题,但错误消息表明可能是最佳选择:
public class JavaProtected {
protected int getInt() { return 5; }
}

scala> trait T extends JavaProtected { def i = getInt }
<console>:8: error: Implementation restriction: trait T accesses
protected method getInt inside a concrete trait method.
Add an accessor in a class extending class JavaProtected as a workaround.

注意最后一行。
class WithAccessor extends JavaProtected { protected def myAccessor = getInt }
trait T extends WithAccessor { def i = myAccessor }

作品。

关于scala - 如何解决 "Implementation restriction: trait ... accesses protected method ... inside a concrete trait method.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17557057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com