方法,可选参数 and/or 接受多种数据类型
Methods, Optional Parameters and/or Accepting multiple Data Types
在网上浏览了一段时间寻找我的问题的答案后,我找不到任何似乎可以有效解决我的问题的帖子。
目前我会为每种不同的数据类型输入重载一个方法。
例如:
public void ex1(String in){
public void ex1(int in){
我想会有一种方法可以将其压缩成一行
public void ex1(opt(String in), opt(int in)){
或
public void ex1((String/int) in){
然而,据我所知,还没有人提出合理的方法来使用这两种形式。
重载确实有效,但看起来不像我希望的那样干净,所以任何解决方法或想法将不胜感激。
有办法,但是你acn只提供one
可选参数。
那种方式就是在参数类型前面使用...
。
例如:
public void ex1(int someint, String... in)){
在这种情况下,String in
是一个可选参数,您可以提供或不提供。但是 int someint
是必须提供的参数。
所以String... in
基本上就是一个String[] in
。由于数组可以为空....除此之外(至少我)不知道有任何其他方法可以实现此目的。
这意味着您也不能执行类似必须输入一个参数而其他参数可以忽略的操作。您可以只忽略一个参数,而必须传递其他参数。
此外,每个方法仅使用一个参数。换句话说,只有一个参数可以是可选的。否则你必须使用方法重载。
但是(正如评论中所说),这不是一个有效的方法。由于您将不得不为每个变量的可能性编写逻辑,并且与方法重载的甜蜜而有效的方法相比,代码将是一团糟。
编辑:
varargs(或此可选参数)必须作为方法中的最后一个参数出现。感谢@Makoto 指出这一点。
I would imagine there would be a way to condense this into one line
你可能会这样做:
public void ex1(String in1, int in2) { // I don't believe they can have the same name
// ...
}
至于可选变量,我只是将变量设置为一个值,然后在方法内部测试该值是否等于该 "default" 值。
ex1("Hey", 0);
public void ex1(String in1, int in2) {
boolean useString = true;
boolean useInt = true;
if(in1.length() < 1) {
useString = false;
}
if(in2 != 0) {
useInt = false;
}
if(useString) {
// ...
}
if(useInt) {
// ...
}
}
编辑:关于一个可选变量,请参阅 Jaskaranbir Singh 的回答。
我会做的是:
public void ex1(String[] args){}
通过使用它,您可以拥有任意数量的数据类型(如果有的话)。
完整代码如下所示:
public void ex1(String[] args){
try{
if(/*I know there is some parse string techique*/args[] == ...){
//code here
}
catch(Exception E){}
希望你明白了,基本上你有一个字符串数组,然后将它解析为一个 int、boolean 等...并将你将放入单独函数中的代码放入 if 语句中
尝试 this:
public void ex1(Serializable in){
// .....
}
总是适合我。 String 是可序列化的,对于原始类型,它使用 autoboxing 并自动将 int 转换为 Integer 等等,并且 Integer 也是可序列化的,因此 ex1(1) 将像 expexted 一样工作。您只需要检测真实类型:
if(Integer.class.isInstance(in)){
int intVal = ((Integer)in).intValue();
// ...
} else if(String.class.isInstance(in)){
String strVal = (String) in;
// ...
}
极端情况是当 in
为 null 时,- 在这种情况下很难检测到真实类型(仍然可能),但最重要的是你不需要那个。
在网上浏览了一段时间寻找我的问题的答案后,我找不到任何似乎可以有效解决我的问题的帖子。
目前我会为每种不同的数据类型输入重载一个方法。
例如:
public void ex1(String in){
public void ex1(int in){
我想会有一种方法可以将其压缩成一行
public void ex1(opt(String in), opt(int in)){
或
public void ex1((String/int) in){
然而,据我所知,还没有人提出合理的方法来使用这两种形式。
重载确实有效,但看起来不像我希望的那样干净,所以任何解决方法或想法将不胜感激。
有办法,但是你acn只提供one
可选参数。
那种方式就是在参数类型前面使用...
。
例如:
public void ex1(int someint, String... in)){
在这种情况下,String in
是一个可选参数,您可以提供或不提供。但是 int someint
是必须提供的参数。
所以String... in
基本上就是一个String[] in
。由于数组可以为空....除此之外(至少我)不知道有任何其他方法可以实现此目的。
这意味着您也不能执行类似必须输入一个参数而其他参数可以忽略的操作。您可以只忽略一个参数,而必须传递其他参数。
此外,每个方法仅使用一个参数。换句话说,只有一个参数可以是可选的。否则你必须使用方法重载。
但是(正如评论中所说),这不是一个有效的方法。由于您将不得不为每个变量的可能性编写逻辑,并且与方法重载的甜蜜而有效的方法相比,代码将是一团糟。
编辑:
varargs(或此可选参数)必须作为方法中的最后一个参数出现。感谢@Makoto 指出这一点。
I would imagine there would be a way to condense this into one line
你可能会这样做:
public void ex1(String in1, int in2) { // I don't believe they can have the same name
// ...
}
至于可选变量,我只是将变量设置为一个值,然后在方法内部测试该值是否等于该 "default" 值。
ex1("Hey", 0);
public void ex1(String in1, int in2) {
boolean useString = true;
boolean useInt = true;
if(in1.length() < 1) {
useString = false;
}
if(in2 != 0) {
useInt = false;
}
if(useString) {
// ...
}
if(useInt) {
// ...
}
}
编辑:关于一个可选变量,请参阅 Jaskaranbir Singh 的回答。
我会做的是:
public void ex1(String[] args){}
通过使用它,您可以拥有任意数量的数据类型(如果有的话)。
完整代码如下所示:
public void ex1(String[] args){
try{
if(/*I know there is some parse string techique*/args[] == ...){
//code here
}
catch(Exception E){}
希望你明白了,基本上你有一个字符串数组,然后将它解析为一个 int、boolean 等...并将你将放入单独函数中的代码放入 if 语句中
尝试 this:
public void ex1(Serializable in){
// .....
}
总是适合我。 String 是可序列化的,对于原始类型,它使用 autoboxing 并自动将 int 转换为 Integer 等等,并且 Integer 也是可序列化的,因此 ex1(1) 将像 expexted 一样工作。您只需要检测真实类型:
if(Integer.class.isInstance(in)){
int intVal = ((Integer)in).intValue();
// ...
} else if(String.class.isInstance(in)){
String strVal = (String) in;
// ...
}
极端情况是当 in
为 null 时,- 在这种情况下很难检测到真实类型(仍然可能),但最重要的是你不需要那个。