Java Can';t调用匿名类方法

Java Can';t调用匿名类方法,java,class,closures,Java,Class,Closures,我可以想象一些非常有创意的Java代码: Object thing = new Object() { public void speak() { System.out.println("Hi!"); } }; thing.speak(); 甚至,为了获得完全的闭包效果,定义一个函数接口。。。你明白了吗 为什么这个代码不起作用?我相信您可以这样做:- new Object() { public void speak() { Sys

我可以想象一些非常有创意的Java代码:

Object thing = new Object() {
    public void speak() {
        System.out.println("Hi!");
    }
};
thing.speak();
甚至,为了获得完全的闭包效果,定义一个
函数
接口。。。你明白了吗


为什么这个代码不起作用?

我相信您可以这样做:-

new Object() {    
     public void speak() {
        System.out.println("Hi!");
     }
}.speak();

我可以帮你。

我相信你可以这样做:-

new Object() {    
     public void speak() {
        System.out.println("Hi!");
     }
}.speak();

我可以帮你。

我相信你可以这样做:-

new Object() {    
     public void speak() {
        System.out.println("Hi!");
     }
}.speak();

我可以帮你。

我相信你可以这样做:-

new Object() {    
     public void speak() {
        System.out.println("Hi!");
     }
}.speak();

可能会对您有所帮助。

不确定此示例中的有用性,但原始声明上的某种类型的重写方法是有用的,因为它是重写的,所以您可以调用这些方法。否则,在您的情况下,只需将反射用作:

thing.getClass().getMethod("speak").invoke(thing);
对于覆盖方法:

Object thing = new Object() {
   public void toString() {
      System.out.println("Hi! Me inside your mind!");
      return "not today!";
   }
};
thing.toString();

不确定在本例中是否有用,但原始声明上的某种类型的重写方法是有用的,因为它是重写的,所以可以调用这些方法。否则,在您的情况下,只需将反射用作:

thing.getClass().getMethod("speak").invoke(thing);
对于覆盖方法:

Object thing = new Object() {
   public void toString() {
      System.out.println("Hi! Me inside your mind!");
      return "not today!";
   }
};
thing.toString();

不确定在本例中是否有用,但原始声明上的某种类型的重写方法是有用的,因为它是重写的,所以可以调用这些方法。否则,在您的情况下,只需将反射用作:

thing.getClass().getMethod("speak").invoke(thing);
对于覆盖方法:

Object thing = new Object() {
   public void toString() {
      System.out.println("Hi! Me inside your mind!");
      return "not today!";
   }
};
thing.toString();

不确定在本例中是否有用,但原始声明上的某种类型的重写方法是有用的,因为它是重写的,所以可以调用这些方法。否则,在您的情况下,只需将反射用作:

thing.getClass().getMethod("speak").invoke(thing);
对于覆盖方法:

Object thing = new Object() {
   public void toString() {
      System.out.println("Hi! Me inside your mind!");
      return "not today!";
   }
};
thing.toString();

因为在类型
对象上未声明
speak()
。索蒂里奥斯说:“如果你真的想要反射,你可以使用反射。”。在构造它之后,“thing”仍然声明为仅仅是对象,因此您必须遵守该接口。因为
speak()
不是在类型
对象上声明的。索蒂里奥斯说:“如果你真的想要反射,你可以使用反射。”。在构造它之后,“thing”仍然声明为仅仅是对象,因此您必须遵守该接口。因为
speak()
不是在类型
对象上声明的。索蒂里奥斯说:“如果你真的想要反射,你可以使用反射。”。在构造它之后,“thing”仍然声明为仅仅是对象,因此您必须遵守该接口。因为
speak()
不是在类型
对象上声明的。索蒂里奥斯说:“如果你真的想要反射,你可以使用反射。”。构造之后,“thing”仍然声明为Object,因此必须遵循该接口。为什么你认为这与OP有什么不同?它会像他那样打印“Hi!”为什么你认为这与OP有什么不同?我直接使用对象而不使用变量thing它编译并运行,这与OP的内容不同。但是,如果不首先声明包含speak方法的接口,您仍然无法将其存储在变量或字段中。为什么您认为这与OP有什么不同?它会像OP一样打印“Hi!”为什么您认为这与OP有什么不同?我直接使用对象而不使用变量thingIt编译并运行,这与OP的内容不同。但是,如果不首先声明包含speak方法的接口,您仍然无法将其存储在变量或字段中。为什么您认为这与OP有什么不同?它会像OP一样打印“Hi!”为什么您认为这与OP有什么不同?我直接使用对象而不使用变量thingIt编译并运行,这与OP的内容不同。但是,如果不首先声明包含speak方法的接口,您仍然无法将其存储在变量或字段中。为什么您认为这与OP有什么不同?它会像OP一样打印“Hi!”为什么您认为这与OP有什么不同?我直接使用对象而不使用变量thingIt编译并运行,这与OP的内容不同。但是,如果不至少首先声明包含speak方法的接口,就不能将其存储在变量或字段中。