-2

我有一个功能

boolean isValid(/* what goes in here? */) {  
     //do stuff  
}

在函数签名中,我必须在参数列表中输入什么才能让方法接受可能是任何类型(原始或对象)的单个参数?

我在这个网站和谷歌上搜索过,但我只能找到返回类型未知的情况。

4

4 回答 4

3

如果您让函数接受通用对象类型,Java 将创建任何原始数据类型的对象版本(例如,整数代表 int)。

于 2013-09-07T00:24:11.837 回答
1

我觉得你有点困惑。我将尝试澄清一些事情:

  • 您可能知道方法的返回类型是将传递给调用该方法的代码部分(也称为客户端)的值。Java 中的每个方法/函数只能返回一种类型(我假设您熟悉基本的多态性并且您知道什么是 IS A 关系......)。这是第一个澄清,您可以只返回一种类型,但可以返回一个或多个对象(有数据结构类型)。

  • 参数是方法/函数的调用者/客户端可以传递给它进行处理的值。参数可以有零个或多个参数,这意味着您可以传递任意数量的对象。

  • 参数与参数完全相同,只是术语差异而已。我想准确地使用术语,可以说参数是定义方法时的括号,而参数是调用方法时的括号。

  • 在返回类型或参数/参数中,您可以传递的两种类型是对象或原始类型。如果您使用 Object 类型的东西,这将允许您返回任何对象(Object 是所有类的超类)。但是原始类型不是对象,因此签名中的 Object 类型不允许您传递数字,但是有一个小技巧……在 Java 中有称为原始包装器的特殊类型的 Objects(Integer,Double.. .) 这个对象是基元的对象表示,有时使用它们是因为它们具有一些内置函数,可以帮助程序员轻松操作数据(这不是重点,继续阅读...),每个表示数字基元的包装器type,扩展了一个名为 Number 的类,并且由于 Java 有一个称为自动装箱的特性,

无论如何,我不知道这是否是你正在寻找的把戏,但无论如何我只想建议你,根本没有理由做你正在尝试的事情,这听起来很奇怪,我不知道不认为在现实生活中的编程中真的需要这样的东西。

看看这段代码:

public static void main( String[] args )
{
    App app = new App();
    app.method(5);
}

public void method(Number number) {
    System.out.print(number);
}

另一种选择:为了使参数通用,我可以考虑的另一个示例是使用泛型。所以只是为了结束这个答案来证明我的观点,这里有一个方法可以让你传递你想要的任何东西,不管是原始的还是对象的:

public class App 
{
    public static void main( String[] args )
    {
        App app = new App();
        app.method(5);

        app.someMethod(9);
        app.someMethod("Whatever");
        app.someMethod(true);
    }

    public void method(Number number) {
       System.out.println(number);
    }

    public <T> void someMethod(T t) {
       System.out.println(t);
    }

}

我希望你觉得这很有用,但我坚持我怀疑你在现实生活中永远不会做这样的事情。

于 2013-09-07T00:51:59.940 回答
1

阅读问题和评论,您对编译语言如何工作的看法似乎有点偏离。

如果你让你的函数只接受一种类型(例如字符串),那么如果调用者没有传递作为该类型实例的对象,它将无法编译。“不编译”意味着他们甚至无法在不修复错误的情况下运行程序。编译器为您强制执行此类型安全,因此您不必担心这一点。

于 2013-09-07T00:28:52.587 回答
1

阅读完评论后,您似乎需要验证人们传递给您的任何对象,并且可能随着时间的推移您将不得不支持更多类型。

最简单的解决方案就像 jtoomey 所说的那样,制作一个类似public boolean isValid(Object val). 但是,请考虑您必须编写多少 if 语句,以及在需要新类型验证时修改代码的难度。

对我来说,我可能会做一些比仅仅提供一种方法更复杂的事情。我会利用工厂来创建基于类类型的验证器,例如:

public interface Validator<T> {

   public boolean isValid(T val) {
   }
}

public class ValidatorFactory {

    public static ValidatorFactory create(String configFile) {
         /*read config and create new instance */
    }

    public Validator<T> createValidator(Class<T> clazz) {
         /* base on config and create validator base on type*/
    }
} 


public class Application {

    public static ValidatorFactory vFactory = ValidatorFactory.create() 

    public static void main(String[] args) {

         Object val = Arguments.getVal(); //assume this exists

         Validator<Object> validator = vFactory.create(val.class);
         if (validator == null) {
            System.out.println("not valid");
            return;
         }

         System.out.println(validator.isValid());
    }
}

请注意,我个人认为这是一个糟糕的解决方案,因为您正在抛弃 Java 的类型安全特性。但是如果你真的必须,拥有一个可配置的工厂会比一个接受任何类型的方法更好。拥有Validator接口可以让您在编写验证代码时知道类型。

于 2013-09-07T01:27:26.247 回答