- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
鉴于此示例代码...
package example;
public class Main {
public static void main(String[] args) {
System.out.println(MyEnum.X.getValue());
}
private enum MyEnum {
X(){
@Override
String getValue() {
return toString("XYZ"); //error here
}
};
abstract String getValue();
private static String toString(String output) {
return output;
}
}
}
产生以下编译错误:
Error:(12, 40) java: method toString in class java.lang.Enum<E> cannot be applied to given types;
required: no arguments
found: java.lang.String
reason: actual and formal argument lists differ in length
IntelliJ 存在一个不同的问题:来自 toString("XYZ")
的 toString
带有红色下划线,并且消息“'toString(java.lang.String)”显示了“在 'example.Main.MyEnum' 中具有私有(private)访问权限”,以及“使 'MyEnum.toString' 包私有(private)”的解决方案。
对我来说奇怪的是,以下任何一项都可以解决此问题:
X.toString("XYZ")
。MyEnum.toString("XYZ")
。super.toString("XYZ")
。 (但是 this.toString("XYZ")
不起作用)现在,对于任何生产代码,我可能会将该方法命名为其他名称(可能更能描述我将用它做什么)并继续,但我仍然想知道,为什么会发生这种情况?为什么 IntelliJ 和 javac 的错误消息不同?
这个问题可能类似于 Cannot make a static reference to the non-static field memberVariable with private variable ,但我觉得它并不能完全解释问题 - 为什么重命名有效?
最佳答案
首先,这个问题并不是枚举所特有的。它适用于任何内部类。我重构了您的示例以删除枚举,这演示了内部类和匿名内部类存在相同的问题。
class Main {
public static void main(String[] args) {
Main main = new Main() {
{
System.out.println(toString("XYZ")); // same error
}
};
}
class Foo {
{
System.out.println(toString("XYZ")); // same error
}
}
private static String toString(String output) {
return output;
}
}
在 JLS here 中进行了解释:
Example 6.5.7.1-1. Simple Method Names
The following program demonstrates the role of scoping when determining which method to invoke.
class Super {
void f2(String s) {}
void f3(String s) {}
void f3(int i1, int i2) {}
}
class Test {
void f1(int i) {}
void f2(int i) {}
void f3(int i) {}
void m() {
new Super() {
{
f1(0); // OK, resolves to Test.f1(int)
f2(0); // compile-time error
f3(0); // compile-time error
}
};
}
}For the invocation
f1(0)
, only one method named f1 is in scope. It is the methodTest.f1(int)
, whose declaration is in scope throughout the body of Test including the anonymous class declaration. §15.12.1 chooses to search in class Test since the anonymous class declaration has no member namedf1
. Eventually,Test.f1(int)
is resolved.For the invocation
f2(0)
, two methods namedf2
are in scope. First, the declaration of the methodSuper.f2(String)
is in scope throughout the anonymous class declaration. Second, the declaration of the methodTest.f2(int)
is in scope throughout the body of Test including the anonymous class declaration. (Note that neither declaration shadows the other, because at the point where each is declared, the other is not in scope.) §15.12.1 chooses to search in class Super because it has a member namedf2
. However,Super.f2(String)
is not applicable tof2(0)
, so a compile-time error occurs. Note that classTest
is not searched.For the invocation
f3(0)
, three methods namedf3
are in scope. First and second, the declarations of the methodsSuper.f3(String)
andSuper.f3(int,int)
are in scope throughout the anonymous class declaration. Third, the declaration of the methodTest.f3(int)
is in scope throughout the body of Test including the anonymous class declaration. §15.12.1 chooses to search in classSuper
because it has a member namedf3
. However,Super.f3(String)
andSuper.f3(int,int)
are not applicable tof3(0)
, so a compile-time error occurs. Note that classTest
is not searched.Choosing to search a nested class's superclass hierarchy before the lexically enclosing scope is called the "comb rule" (§15.12.1).
关于java - Enum 的匿名实现无法使用参数引用 Enum 的私有(private)静态 toString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60095314/
所以 promises 对我来说是相当新的,但我喜欢这个想法。 之前... 我以前用过这个,它只在文件被完全读取并按预期工作后才简单地返回数据: function something{ fo
当我尝试编译时出现以下错误: In member function 'double search::IDAstar::dfs(const State&, double)': 153:18: erro
最接近下面的是什么?不幸的是,下面的方法名称编译错误。 int val = delegate(string s) { return 1; }("test"); 我也尝试了 (...)=>{..
1、评论提交超时: 大家可能会发现,在提交评论非常缓慢时最容易出现“匿名”现象,这种情况主要是由于评论提交时执行时间过长引起的,可能是装了比较耗时的插件(比如Akismet等);很多博
我想在同一个表中使用一个键插入一个匿名表,如下所示: loadstring( [[return { a = "One", b = a.." two" }]] ) 在我看来,这应该返回下表: {
有人知道免费的匿名 smtp 服务吗?我想让我的应用程序的用户能够偶尔向我发送一封匿名电子邮件,而无需配置输入他们电子邮件帐户的服务器。我想我可以为此目的设置一个 gmail 帐户并将凭据嵌入到应用程
我有这个数据补丁: ALTER TABLE MY_TABLE ADD new_id number; DECLARE MAX_ID NUMBER; BEGIN SELECT max(id)
假设我有以下数据框。 Person_info (Bob, 2) (John, 1) (Bek, 10) (Bob, 6) 我想通过保持它们的值(value)来匿名。 Person_info (Pers
根据多个国家/地区的法律要求,我们在日志文件中匿名化用户的 IP 地址。使用 IPv4,我们通常只是匿名化最后两个字节,例如。而不是 255.255.255.255我们记录255.255.\*.\*
我正在学习有关 Scala 的更多信息,但在理解 http://www.scala-lang.org/node/135 中的匿名函数示例时遇到了一些麻烦。 .我复制了下面的整个代码块: object
我正在开设一个 Commerce 网上商店。 我想添加 Commerce 愿望 list ,但现在该模块仅适用于注册用户,因为未注册它不起作用。 我将显示 block 中的角色设置为匿名,但即使在更改
我正在使用发现的 Google Apps 脚本 here让匿名用户将文件上传到我的 Google 云端硬盘。 我想要的是脚本使用表单上输入的名称创建一个文件夹,然后将文件存放在该文件夹中。 到目前为止
我遇到的情况是,我正在等待一些事件的发生。我看到很多关于如何使用命名函数使用 setTimeout 的好例子,但是有没有办法使用某种匿名方法来设置超时? 代码目前看起来像这样: testForObje
我一直在阅读一些关于 Android 内存泄漏的文章,并观看了来自 Google I/O 的这个有趣的视频 on the subject . 尽管如此,我仍然不完全理解这个概念,尤其是当它对用户安全或
我正在尝试适应 Spring JDBC,但让我烦恼的是使用这些匿名类,我们不能传递任何局部变量,除非它们是最终的,这可能很容易安排,但是如果我需要循环一个怎么办?数组还是集合?我无法将“FedMode
我正在尝试将数据输入到 Oracle 数据库中。这将是一个带有多个参数的存储过程……我的意思是像 27 个参数(别问,我没有设计它)…… 现在我必须以某种方式填充此存储过程的参数...存储过程采用的大
我之前问过这个问题:Combine a PartialFunction with a regular function 然后意识到,我实际上并没有问对。 所以,这是另一个尝试。 如果我这样做: va
我想从 C++ 执行一个匿名的 Qt 脚本函数,但不知道要使用的 QScriptContext。 这是脚本: { otherObject.Text = "Hello World"; setTi
我有一个返回 promise 的函数。 (本例中为 foo) 我尝试在声明为匿名的解析函数中调用此函数。 我已经尝试过使用this 但这不起作用。 我的代码是这样的 var foo = functio
这个问题的灵感来自这个 excellent example .我有 ASP.NET Core MVC 应用程序,我正在编写 unit tests为 Controller 。其中一种方法返回带有匿名类型
我是一名优秀的程序员,十分优秀!