Java 如何使函数接受任何类型(不一定是对象)?

Java 如何使函数接受任何类型(不一定是对象)?,java,Java,我有一个函数 boolean isValid(/* what goes in here? */) { //do stuff } 在函数签名中,我必须在参数列表中输入什么才能使方法接受任何类型(原语或对象)的单个参数 我在这个网站和谷歌上搜索过,但我只能找到返回类型未知的情况。如果您有函数接受通用对象类型,Java将创建任何原始数据类型的对象版本(即整数表示int)。阅读问题和注释,似乎你对编译语言如何工作的看法有点偏离了 如果您使函数只接受一种类型(例如字符串),那么如果调用

我有一个函数

boolean isValid(/* what goes in here? */) {  
     //do stuff  
}
在函数签名中,我必须在参数列表中输入什么才能使方法接受任何类型(原语或对象)的单个参数


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

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

阅读问题和注释,似乎你对编译语言如何工作的看法有点偏离了


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

我认为您有点困惑。 我将试图澄清一些事情:

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

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

  • 参数与参数完全相同,这只是术语上的区别,没有其他区别。如果你想准确地理解这些术语,你可以说在定义方法时参数是方括号,而在调用方法时参数是方括号

  • 在返回类型或参数/参数中,可以传递的两种类型是对象或基元类型。 如果您使用Object类型的对象,这将允许您返回任何对象(Object是所有类的超类)。但基元类型不是对象,所以签名中的类型对象不允许传递数字,但有一个小技巧。。。 在Java中,有一些特殊类型的对象称为原语包装器(Integer、Double…),这些对象是原语的对象表示形式,有时使用它们是因为它们具有一些内置函数,可以帮助程序员轻松地操作数据(这不是重点,请继续阅读…),每一个表示数字原语类型的包装器都扩展了一个名为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);
    }

}
公共类应用程序
{
公共静态void main(字符串[]args)
{
App App=新App();
附录方法(5);
附录2方法(9);
app.someMethod(“无论如何”);
app.someMethod(true);
}
公共作废方法(编号){
系统输出打印项次(编号);
}
公共方法(T){
系统输出打印ln(t);
}
}

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

在阅读完这些评论后,您似乎有一种业务需要,需要验证人们传递给您的任何对象,并且随着时间的推移,您可能必须支持更多类型

最简单的解决方案就像jtoomey所说的,让像
public boolean这样的方法有效(Object val)
。但是,请考虑需要编写多少if语句,以及在需要新类型验证时修改代码有多困难

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

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());
    }
}
公共接口验证程序{
公共布尔值有效(T val){
}
}
公共类验证器工厂{
公共静态验证器工厂创建(字符串配置文件){
/*读取配置并创建新实例*/
}
公共验证器createValidator(类clazz){
/*基于配置并基于类型创建验证程序*/
}
} 
公共类应用程序{
publicstaticvalidatorfactory vFactory=ValidatorFactory.create()
公共静态void main(字符串[]args){
Object val=Arguments.getVal();//假设存在
Validator Validator=vFactory.create(val.class);
if(验证器==null){
System.out.println(“无效”);
返回;
}
System.out.println(validator.isValid());
}
}

请注意,我个人认为这是一个糟糕的解决方案,因为您正在抛弃Java的类型安全特性。但是,如果您真的必须这样做,那么拥有一个可配置的工厂将比只接受任何类型的方法要好。使用
验证程序
界面可以让您在编写验证代码时知道类型。

如果您不知道它是什么,您将如何处理它?我将检查正文中的类型。然后呢?根据类型生成100个不同的案例