Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.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 - Fatal编程技术网

Java:如何在不指定完整类型的情况下指定函数参数的类型

Java:如何在不指定完整类型的情况下指定函数参数的类型,java,Java,假设我有一个这样的接口 interface MyIntf{ void generate(); } 下面是一种方法 void run(Myintf x) { x.generate(); } 我可以使用实现MyIntf的类的对象调用run 但是在Java中,是否可以在没有显式接口名称的情况下声明run i、 我可以指定这样运行吗 void run("Some object which has a method called 'void generate()'" x){ x.gener

假设我有一个这样的接口

interface MyIntf{
  void generate();
}
下面是一种方法

void run(Myintf x) {
  x.generate();
}
我可以使用实现MyIntf的类的对象调用run

但是在Java中,是否可以在没有显式接口名称的情况下声明run

i、 我可以指定这样运行吗

void run("Some object which has a method called 'void generate()'" x){
  x.generate();
}
可以使用任何类的对象调用and run,该类的方法为

void generate();

你是说好像你会做这样的事

void run(Object x) {
  ((Myintf)x).generate();
}

你是说好像你会做这样的事

void run(Object x) {
  ((Myintf)x).generate();
}

然后,您必须使用反射来做您想做的事情。比如:

void run(Object o) {
    Method m = o.getClass().getMethod("generate", new Class[0]);
    if (m!=null)
        m.invoke(o, new Object[0]);
}

您还必须添加必要的try/catch,我不太清楚,我认为您可以传递null而不是空数组。

然后您必须使用反射来执行您想要的操作。比如:

void run(Object o) {
    Method m = o.getClass().getMethod("generate", new Class[0]);
    if (m!=null)
        m.invoke(o, new Object[0]);
}

您还必须添加必要的try/catch,我不太清楚,我认为您可以传递null而不是空数组。

不,您不能这样做。这正是接口的用途:
除非您不使用反射..

不,否则您不能这样做。这正是接口的用途: 除非您不使用反射..

否则您可以执行以下操作:

void run(Object x){
    try{
        //use reflection to try and run a generate() method on x
    } catch (Exception e){}
}
但在编译时无法强制执行该操作。

您可以执行以下操作:

void run(Object x){
    try{
        //use reflection to try and run a generate() method on x
    } catch (Exception e){}
}

但是没有办法在编译时强制执行该操作。

不可能按照您的想法指定某个对象,该对象在Java中具有名为void generate的方法

原则上,您可以通过反射实现这一点:您只需传入一个对象,并在运行时检查是否有可以调用的void generate方法。然而,这意味着您正在抛弃编译器提供的类型安全性;我不建议使用此解决方案

public void run(Object obj) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
    Method m = obj.getClass().getMethod("generate");
    m.invoke(obj);
}

按照您的想法,不可能在Java中指定具有名为void generate的方法的对象

原则上,您可以通过反射实现这一点:您只需传入一个对象,并在运行时检查是否有可以调用的void generate方法。然而,这意味着您正在抛弃编译器提供的类型安全性;我不建议使用此解决方案

public void run(Object obj) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
    Method m = obj.getClass().getMethod("generate");
    m.invoke(obj);
}

在Java中实现这一点的唯一方法是使用反射或使用instanceof运算符(不推荐使用),然后将传递的对象强制转换为正确的类/接口

在Java中执行此操作的唯一方法是使用反射或使用不推荐的instanceof运算符,然后将要传递的对象强制转换为正确的类/接口

Java使用而不是键入

仅仅因为一个方法有相同的名称和参数,并不意味着它做同样的事情,把相机/枪放在你的头上然后拍摄。如果需要使旧类型符合特定接口,请使用适配器。避免反射。

Java使用而不是键入


仅仅因为一个方法有相同的名称和参数,并不意味着它做同样的事情,把相机/枪放在你的头上然后拍摄。如果需要使旧类型符合特定接口,请使用适配器。避免反射。

事实并非如此,您始终需要定义类型。为什么要采用这种方法?。我只是好奇,所以没有办法用我知道的最少的信息来声明一个匿名类型want@SajanChandran只想将程序的一部分解耦。如果我使用一个接口,我会得到一些解耦,但是否有可能更进一步。i、 e.匿名指定接口,没有名称。如果不是,则始终需要定义类型。为什么要采用这种方法?。我只是好奇,所以没有办法用我知道的最少的信息来声明一个匿名类型want@SajanChandran只想将程序的一部分解耦。如果我使用一个接口,我会得到一些解耦,但是否有可能更进一步。i、 e.匿名指定接口,不使用名称我不希望run的实现知道任何接口名称。run只关心对象有一个名为generate的方法。在这种情况下,您必须使用反射。我不希望run的实现知道任何接口名称。run只关心对象有一个名为generate的方法。在这种情况下,您必须使用反射。当然可以通过反射来实现,但我希望run的参数规范能够捕获以下信息:任何具有void generate方法的对象,因此我不需要使用反射。很抱歉,没有解决方案。要么强制类型,要么使用instanceof,但在所有情况下,您的参数都需要声明它实现了您的接口。当然,可以通过反射来实现它,但是我希望run的参数规范能够捕捉到这样的信息:任何有void方法的对象都可以生成,这样我就不需要使用反射了。要么强制该类型,要么使用instanceof,但在所有情况下,您的参数都需要声明它在中实现了 介面。