Suz*_*ioc 15 java syntax member inner-classes
是否有任何Java语法来访问外部类中匿名内部类中定义的新方法?我知道可以有各种变通方法,但我想知道是否存在特殊语法?
例如
class Outer {
ActionListener listener = new ActionListener() {
@Override
void actionPerformed(ActionEvent e) {
// do something
}
// method is public so can be accessible
public void MyGloriousMethod() {
// viva!
}
};
public void Caller() {
listener.MyGloriousMethod(); // does not work!
}
}
Run Code Online (Sandbox Code Playgroud)
我自己的解决方案
我只是把所有的方法和成员都移到了外层.
Tom*_*ine 20
一旦匿名类实例被隐式转换为命名类型,就无法将其强制转换,因为匿名类型没有名称.您可以this在类中,在表达式后面的表达式中访问匿名内部类的其他成员,并且可以通过方法调用推断并返回类型.
Object obj = new Object() {
void fn() {
System.err.println("fn");
}
@Override public String toString() {
fn();
return "";
}
};
obj.toString();
new Object() {
void fn() {
System.err.println("fn");
}
}.fn();
identity(new Object() {
void fn() {
System.err.println("fn");
}
}).fn();
...
private static <T> T identity(T value) {
return value;
}
Run Code Online (Sandbox Code Playgroud)
小智 6
我班上的一名学生问我们的教授,这是否可以在前几天完成.以下是我作为一个很好的概念证明,它可以做到,虽然不值得,它实际上是可能的,这是如何:
public static void main(String[] args){
//anonymous inner class with method defined inside which
//does not override anything
Object o = new Object()
{
public int test = 5;
public void sayHello()
{
System.out.println("Hello World");
}
};
//o.sayHello();//Does not work
try
{
Method m = o.getClass().getMethod("sayHello");
Field f = o.getClass().getField("test");
System.out.println(f.getInt(o));
m.invoke(o);
} catch (Exception e)
{
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
通过使用Java的Method类,我们可以通过传入方法的字符串值和参数来调用方法.使用字段也可以完成同样的事情.
只是觉得分享这个很酷!
var有趣的是,现在构造(Java 10 或更高版本)允许这样做。例子:
var calculator = new Object() {
BigDecimal intermediateSum = BigDecimal.ZERO;
void calculate(Item item) {
intermediateSum = Numbers.add(intermediateSum, item.value);
item.sum= intermediateSum;
}
};
items.forEach(calculator::calculate);
Run Code Online (Sandbox Code Playgroud)
这里有方法参考,但当然也适用于点方法调用。它也适用于字段。享受新的 Java。:-)
我var在这里找到了更多匿名类的技巧: https: //blog.codefx.org/java/tricks-var-anonymous-classes/
| 归档时间: |
|
| 查看次数: |
8877 次 |
| 最近记录: |