我有一个功能
boolean isValid(/* what goes in here? */) {
//do stuff
}
在函数签名中,我必须在参数列表中输入什么才能让方法接受可能是任何类型(原始或对象)的单个参数?
我在这个网站和谷歌上搜索过,但我只能找到返回类型未知的情况。
我有一个功能
boolean isValid(/* what goes in here? */) {
//do stuff
}
在函数签名中,我必须在参数列表中输入什么才能让方法接受可能是任何类型(原始或对象)的单个参数?
我在这个网站和谷歌上搜索过,但我只能找到返回类型未知的情况。
如果您让函数接受通用对象类型,Java 将创建任何原始数据类型的对象版本(例如,整数代表 int)。
我觉得你有点困惑。我将尝试澄清一些事情:
您可能知道方法的返回类型是将传递给调用该方法的代码部分(也称为客户端)的值。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);
}
}
我希望你觉得这很有用,但我坚持我怀疑你在现实生活中永远不会做这样的事情。
阅读问题和评论,您对编译语言如何工作的看法似乎有点偏离。
如果你让你的函数只接受一种类型(例如字符串),那么如果调用者没有传递作为该类型实例的对象,它将无法编译。“不编译”意味着他们甚至无法在不修复错误的情况下运行程序。编译器为您强制执行此类型安全,因此您不必担心这一点。
阅读完评论后,您似乎需要验证人们传递给您的任何对象,并且可能随着时间的推移您将不得不支持更多类型。
最简单的解决方案就像 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
接口可以让您在编写验证代码时知道类型。