在浏览网页一段时间寻找我的问题的答案后,我找不到任何似乎能为我的问题提供有效解决方案的帖子。
目前,我会为每种不同的数据类型输入重载方法。
例如:
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){
然而,就我所见,没有人提出合理的方法来使用这些形式。
重载确实有效,但看起来并不像我想的那样干净,所以任何变通办法或想法都会受到赞赏。
答案 0 :(得分:1)
有一种方法,但您只能提供one
可选参数。
这种方式是在参数类型前面使用...
。
例如:
public void ex1(int someint, String... in)){
在这种情况下,String in
是一个可选参数,您可以提供或不提供。但int someint
是必须提供的参数。
所以String... in
基本上是String[] in
。因为数组可以为null ....除此之外(至少我)不知道有任何其他方法来实现这一点。
这意味着您也无法执行某些操作,例如必须输入其中一个参数,而其他参数可以忽略。您可以忽略一个参数,而其他参数必须通过。
这也适用于每种方法只有一个参数。换句话说,只需一个参数可选。否则你必须使用方法重载。
但是(如评论中所述),这不是一种有效的方法。因为你必须为每个变量的可能性编写逻辑,并且与方法重载的甜蜜有效的方法相比,代码会非常混乱。
编辑:
varargs (或此可选参数)必须显示为方法中的最后一个参数。感谢@Makoto指出这一点。
答案 1 :(得分:0)
我认为有一种方法可以将其压缩成一行
你可能会这样做:
public void ex1(String in1, int in2) { // I don't believe they can have the same name
// ...
}
就可选变量而言,我只需将变量设置为一个值,并在方法内部进行测试,以查看该值是否等于“默认”值。
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的回答。
答案 2 :(得分:-1)
尝试this:
public void ex1(Serializable in){
// .....
}
始终适合我。 String是Serializable,对于原始类型,它使用autoboxing并自动将int转换为Integer,依此类推,而Integer也是Serializable,因此ex1(1)将作为exxx工作。您只需检测实际类型:
if(Integer.class.isInstance(in)){
int intVal = ((Integer)in).intValue();
// ...
} else if(String.class.isInstance(in)){
String strVal = (String) in;
// ...
}
转角情况是in
为空时, - 在这种情况下很难检测到真实类型(仍然可能),但最重要的是你不需要它。
答案 3 :(得分:-2)
我会做的是:
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,ect ......并将你在单独函数中放入的代码放入if语句