我在这里搜索了答案,我找到的每一个帖子实际上都是我所寻求的“片段”。
我想找到比这更好的方法:
〜编辑:OOPS!我的意思是首先使用原始的Wrapper类,但是当时在调用方法时我正在考虑使用原始类型〜 感谢您注意到它:)
@Override
public void setValue(Object value) {
if (value instanceof String) {
} else if (value instanceof Integer) { // and not 'int'
} else if (value instanceof Long) { // and not 'long'
}
}
// The usage that made me confused in the first place :
int i = 42;
setValue(i);
注意@Override注释:这是一个接口方法的实现。此方法将根据实现接受不同的类型,因此我不想使用不同的参数类型创建三个不同的方法。
在此示例中,这是一个只接受数字而不接受其他内容的文本框,因此它只能由字符串(由正则表达式^[0-9]*$
验证),long和int表示。
我也喜欢它 - 也许,最终 - 接受更像POJO的自定义(和简单)DTO,但如果这个特殊性使其他一切变得复杂,我还有其他的东西,所以不要太担心很多关于这个。
正如我所说,这个界面的不同实现可以接受完全不同的类型。
*我显然没有想要一种方法来切换整数,长整数和字符串(它们不能切换,但直到Java7),我想切换instanceofs *
看了
我的实施显然有效,但我觉得有更好的方法。 我想知道是否有比我做的更干净的方法,你有什么建议和原因?
感谢您的时间。 此致Dominic Brissette。
编辑:使用原始类型和自动装箱
public static void main(String[] args) {
int i = 42;
System.out.println(autoboxing(i));
}
public static boolean autoboxing(Object o) {
return o instanceof Integer;
}
输出true
,因为最后,myInt instanceof Integer
有点真实......!
答案 0 :(得分:4)
您可以做的一件事是将基元包装在一个接口中,这样实现此接口的任何值类型都可以作为值传递。
public interface ValueInterface {
processValue();
}
然后设定值方法如下:
public void setValue(ValueInterface value) {
value.processValue();
}
现在,您将工作委托给知道如何对自己采取行动的实际对象。
答案 1 :(得分:2)
答案 2 :(得分:1)
处理此问题的另一种方法是为任何类型的对象编写代码。
private JLabel label;
@Override
public void setValue(Object value) {
String text = value.toString();
Long.parseLong(text); // to validate as a long value.
label.setText(text);
}
打开类型的干净方法是使用重载。注意:对象不能是原语。
public void setValue(String value) {
}
public void setValue(int value) { // shouldn't need this.
}
public void setValue(long value) {
}
您很可能不需要单独的int
和long
方法,因为后者很可能就足够了。