- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
复制者:
enum IDs {
ID {
@Override
void getId() {
w(); // warning here
}
};
void getId() {}
private static void w() {}
}
发出警告:
Access to enclosing method w() from the type IDs is emulated by a synthetic accessor method
我了解什么是合成方法 - 我不明白它们如何与枚举一起发挥作用 - 我希望枚举实例具有我在枚举中定义的所有私有(private)方法。实例真的是嵌套类吗?
最佳答案
定义方法的枚举实例,如您的 ID
在这里所做的那样,是枚举类的隐式匿名子类的单例。普通访问规则适用于子类和枚举类之间,因此需要一个合成访问器来查看枚举类的私有(private)特性。
Java 语言规范 requires enums to work this way :
The optional class body of an enum constant implicitly defines an anonymous class declaration (§15.9.5) that extends the immediately enclosing enum type. The class body is governed by the usual rules of anonymous classes...
这当然是它们的实际实现方式。在 JDK 的 javac 中,这发生在 JavacParser::enumeratorDeclaration
中。大约第 3344 行(在此版本中):
JCClassDecl body = null;
if (token.kind == LBRACE) {
JCModifiers mods1 = F.at(Position.NOPOS).Modifiers(Flags.ENUM | Flags.STATIC);
List<JCTree> defs = classOrInterfaceBody(names.empty, false);
body = toP(F.at(identPos).AnonymousClassDef(mods1, defs));
}
if (args.isEmpty() && body == null)
createPos = identPos;
JCIdent ident = F.at(identPos).Ident(enumName);
JCNewClass create = F.at(createPos).NewClass(null, typeArgs, ident, args, body);
相关位是,如果声明中有左花括号(LBRACE
),则解析类主体(classOrInterfaceBody(...)
) 用于匿名类 (names.empty
),然后将其用作实例创建表达式 (NewClass(..., body)
) 中的类主体。如果愿意,您可以按照 JCNewClass
节点的编译进行操作,但正如它的 javadoc 所做的那样,它足以说明它建模:
* A new(...) operation.
如您所知,一个带有类主体的 new
操作会创建一个匿名类。
关于java - java中的枚举类型是枚举实例 "enclosed"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19465274/
template class Vec { T data[S]; public: constexpr Vec(const T& s) : data{s} {} }; templ
我需要不同的参数集,所以我决定使用 @Enclosed .但是,嵌套类必须是静态的,因此方法调用的所有现有方法/常量都必须是静态的。但这很难,因为我无法更改所有这些方法的定义。 有没有什么方法可以不用
编译本规范时: import org.specs.Specification import org.specs.matcher.extension.ParserMatchers class Parse
想法:制作一个内联便捷函数,以同步“内联”对象的固有锁上的函数调用: public inline fun intrinsicSync(block: () -> T): T { return
我有一个如下所示的二维数组: var map = [ [0,0,0,0,0,0,0,0,0,0], [2,2,2,0,0,0,0,0,0,0], [2,2,2,0,2,2,0,
我的项目有问题。我有 2 个类:MainActivity 和 Insert。我在“插入”类中出现错误。 对话框 = new ProgressDialog(MainActivity.this); 我的错
我正在使用 EXCEL 创建一组 UPDATE 语句。许多行的列中包含单引号字符作为字段值的一部分。有没有办法告诉 MySQL 使用“或 ' 之外的不同 ENCLOSURE 字符? 如果能够将角色从标
我正在尝试向 C# 应用程序添加一些新功能 - 特别是,试图复制它的某些行为,但在 Web 浏览器中,而不是像现在这样在应用程序中。 我试图从 MainWindow.cs 类中的方法内部调用在 Bro
复制者: enum IDs { ID { @Override void getId() { w(); // warning here
在 Eclipse 中,当您创建一个类时,有一个复选框显示“封闭类型”。有谁知道它的作用?我附上了截图。 最佳答案 您可以添加 nested class使用 Enclosing type 选项 例如类
这个问题在这里已经有了答案: Is not an enclosing class Java (12 个答案) 关闭 8 年前。 嘿,这是我第一次使用堆栈溢出,我试图在不同的文件中调用一个类(Main
我需要 Select 查询,它会在最后将结果写入文件。我希望输出列用双引号分隔,并且我希望在字段之间有逗号,但是我得到一个查询不正确的错误。 select hostname,ip FIELDS TER
这是我收到错误的代码:错误:不是封闭类:MainActivity。请帮我看看我的代码有什么问题。 public class MyFirebaseMessagingSerivce extends Fir
我有一个以下列类开头的 libgdx 程序: public class MyActivity extends AndroidApplication implements IActivityReques
我在执行以下代码时遇到问题。 实际上,我想使用图像作为指向另一个页面或 Activity 的链接。这是怎么做到的 和 “MainActivity.this 不是封闭类”的问题究竟是什么?这是代码 我有
我有 tsv 形式的数据,我想将它插入到 hbase 中,问题是每个字段都用“'”(单引号)括起来。 如何在导入命令中提供它: hbase org.apache.hadoop.hbase.mapred
我正在阅读文档:https://docs.flutter.io/flutter/widgets/BuildContext-class.html This can lead to some tricky
同学们,我有这样一个问题:1. 在我的第一个类中,我有 public class parseYouTubeAndYahoo extends AsyncTask> 解析来自互联网的数据。但是我需要从另一
Akka 文档记录了使用 Props 的危险变体: // NOT RECOMMENDED within another actor: // encourages to close over enclo
我创建了一个 Eclipse 插件,可以在按下快捷键时打印输出选择的对象。我已经能够做到这一点,但我还想在日志中添加当前方法和当前类名称。我不知道如何进一步进行。我尝试搜索面包屑 API,但无法从我的
我是一名优秀的程序员,十分优秀!