Java 使用toString()方法接受任何对象作为参数

Java 使用toString()方法接受任何对象作为参数,java,generics,duck-typing,Java,Generics,Duck Typing,我正在尝试创建一个方法,它可以接受各种类型的对象,对传入的任何对象执行toString,然后打印它。有时是int,有时是long,有时是字符串,有时是自定义对象,等等。唯一的断言应该是它有一个toString()方法。基本上,我希望模拟python的duck类型,而不是每次使用该方法时都必须在此API之外调用toString() 这是现有的功能: /** * Log a message at TEST level * @param message: The message to log *

我正在尝试创建一个方法,它可以接受各种类型的对象,对传入的任何对象执行toString,然后打印它。有时是int,有时是long,有时是字符串,有时是自定义对象,等等。唯一的断言应该是它有一个toString()方法。基本上,我希望模拟python的duck类型,而不是每次使用该方法时都必须在此API之外调用toString()

这是现有的功能:

/**
 * Log a message at TEST level
 * @param message: The message to log
 */
public void test(String message) {
    log(Level.TEST, message);
}
到目前为止,我一直在尝试增强它:

/**
 * Log a message at TEST level
 * @param message: An object of any class that implements toString.
 */
public void test(Class<?> message) {
    String messageString = message.toString();
    log(Level.TEST, messageString);
}

在Java中是否有一种合理的方法来实现此功能?

任何类都会有一个
toString()
方法,因为
Java.lang.Object
有它。因此,你的断言有点。。。毫无意义

正如@Kevin所提到的,使用
对象消息
而不是
类clazz
就可以了


自动装箱将处理原语。不过有一点值得注意:许多(大多数?)toString()方法的默认输出不是很可读,因为它们遵从Object.toString()方法。

该方法适用于除原语以外的任何类型。您也不应该期望它工作,因为基本类型没有
toString()
方法。你可以使用整数类等等。@GiladNaaman我也试过了,但没有用。无法解析方法“test(java.lang.Integer)”,所有类都从Object继承toString,因此所有类都直接或间接“实现”了该方法。文档中指出,“当一个原语值……作为参数传递给一个需要相应包装类的对象的方法时,Java编译器应用自动装箱。”显然,包装类的期望必须是显式的,因为通配符没有解析。谢谢。@这不是你的问题。你的问题是你没有正确使用泛型。即使您正确地使用了泛型,使用从对象扩展的泛型也没有任何意义。只需使用对象引用。
Cannot resolve method 'test(int)'
public void test(Object message) {
    log(Level.TEST, message.toString());
}