Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/364.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将参数传递给Java中方法内部定义的方法_Java_Methods_Abstract_Overriding - Fatal编程技术网

将参数传递给Java中方法内部定义的方法

将参数传递给Java中方法内部定义的方法,java,methods,abstract,overriding,Java,Methods,Abstract,Overriding,所以情况是这样的: private void myMethod() { System.out.println("Hello World"); //some code System.out.println("Some Other Stuff"); System.out.println("Hello World"); //the same code. } 我们不想重复我们的代码 所描述的技术非常有效: private void myMethod() { f

所以情况是这样的:

private void myMethod()
{
    System.out.println("Hello World"); //some code

    System.out.println("Some Other Stuff"); 

    System.out.println("Hello World"); //the same code. 

}
我们不想重复我们的代码

所描述的技术非常有效:

private void myMethod()
{
    final Runnable innerMethod = new Runnable()
    {
        public void run()
        {
            System.out.println("Hello World"); 
        }
    };

    innerMethod.run();
    System.out.println("Some other stuff"); 
    innerMethod.run(); 
}
但是如果我想把一个参数传递给那个内部方法呢

例如

给我:
类型new Runnable(){}必须实现继承的抽象方法Runnable.run()


告诉我Runnable类型中的run()方法不适用于参数(int)

不,它不是一个方法,而是一个匿名对象。可以为对象创建一个额外的方法

 Thread thread = new Thread(  new Runnable()
    {
      int i,j;
      public void init(int i, int j)
      {
        this.i = i;
        this.j=j;
      }
    });
thread.init(2,3);
thread.start();
将runnable封装在一个线程中,并调用start!不
run()
。 因为您不能调用匿名类的构造函数,正如@HoverCraft所指出的,您可以扩展一个实现
Runnable
的命名类

public class SomeClass implements Runnable
{
   public SomeClass(int i){ }
}

不,那不是一个方法,而是一个匿名对象。可以为对象创建一个额外的方法

 Thread thread = new Thread(  new Runnable()
    {
      int i,j;
      public void init(int i, int j)
      {
        this.i = i;
        this.j=j;
      }
    });
thread.init(2,3);
thread.start();
将runnable封装在一个线程中,并调用start!不
run()
。 因为您不能调用匿名类的构造函数,正如@HoverCraft所指出的,您可以扩展一个实现
Runnable
的命名类

public class SomeClass implements Runnable
{
   public SomeClass(int i){ }
}

看起来您只需要内部方法。Java不允许您拥有它们,因此您描述的
Runnable
hack允许您声明一个内部方法

但是既然你想要更多的控制权,为什么不定义你自己的:

interface Inner<A, B> {
    public B apply(A a);
}
接口内部{
公共B申请(A);
}
然后你可以说:

private void myMethod(..){ 
    final Inner<Integer, Integer> inner = new Inner<Integer, Integer>() {
        public Integer apply(Integer i) {
            // whatever you want
        }
    };


    // then go:
    inner.apply(1);
    inner.apply(2);
private void myMethod(..){
最终内部=新内部(){
公共整数应用(整数i){
//随便你
}
};
//然后去:
内部。应用(1);
内部。应用(2);
}


或者使用提供
functor
对象的库。应该有很多。Apache Commons有一个可以使用的Functor。

看起来您只需要内部方法。Java不允许您拥有它们,因此您描述的
Runnable
hack允许您声明一个内部方法

但是既然你想要更多的控制权,为什么不定义你自己的:

interface Inner<A, B> {
    public B apply(A a);
}
接口内部{
公共B申请(A);
}
然后你可以说:

private void myMethod(..){ 
    final Inner<Integer, Integer> inner = new Inner<Integer, Integer>() {
        public Integer apply(Integer i) {
            // whatever you want
        }
    };


    // then go:
    inner.apply(1);
    inner.apply(2);
private void myMethod(..){
最终内部=新内部(){
公共整数应用(整数i){
//随便你
}
};
//然后去:
内部。应用(1);
内部。应用(2);
}



或者使用提供
functor
对象的库。应该有很多。Apache Commons有一个可以使用的Functor。

好吧,我一点也不清楚为什么这涉及到可运行程序和可能的多线程-你能澄清一下吗?你知道
Runnable
是一个用于
多线程的预定义接口吗?为什么不创建自己的接口呢?这是我发现的在Java中实现方法中的方法的唯一解决方案。但是为什么要在方法中实现方法呢?Runnable并不是为此目的而设计的()。您是否尝试定义自己的接口而不是使用Runnable?这样你就有了你所需要的所有自由度。好吧,我一点也不清楚为什么这涉及到可运行性和可能的多线程-你能澄清一下吗?你知道
Runnable
是一个用于
多线程的预定义接口吗?为什么不创建自己的接口呢?这是我发现的在Java中实现方法中的方法的唯一解决方案。但是为什么要在方法中实现方法呢?Runnable并不是为此目的而设计的()。您是否尝试定义自己的接口而不是使用Runnable?这样你就有了你所需要的所有自由度。或者使用一个非匿名类和一个构造函数来获取感兴趣的参数值。这是可行的,但我不确定它是否能长期帮助OP。为此使用Thread/Runnable感觉非常错误,更不用说start()可能产生的副作用了。@Jerome不幸的是,OP没有解释他或她为什么希望这样做。或者使用一个非匿名类和一个接受感兴趣的参数值的构造函数。这是可行的,但我不确定它对OP有长期的帮助。为此使用Thread/Runnable感觉非常错误,更不用说start()可能产生的副作用了。@Jerome不幸的是,OP没有解释他或她为什么希望这样做。
public B apply(a)-这是打字错误吗?你的意思是
公共B应用(A)
?另外-我认为您在实现中缺少了一些东西-代码给了我
类型new InnerMethod(){}必须实现继承的抽象方法InnerMethod.apply(Object)
是的,很抱歉。我应该把它标记为未经测试的代码。现在修复了。嗯-如果我想创建一个void方法,我将如何编写它?(或传入无效参数?。
public B apply(a)-这是打字错误吗?你的意思是
公共B应用(A)
?另外-我认为您在实现中缺少了一些东西-代码给了我
类型new InnerMethod(){}必须实现继承的抽象方法InnerMethod.apply(Object)
是的,很抱歉。我应该把它标记为未经测试的代码。现在修复了。嗯-如果我想创建一个void方法,我将如何编写它?(或传入一个void参数?)。