[英]Is dynamic overload resolution possible in Java?
所以我有一類重載方法,如下所示:
class Foo {
public void test(Object value) {
...
}
public void test(String value) {
...
}
}
我需要根據其類型將bean的屬性值傳遞給其中一個方法,但在運行時之前我不知道實際的屬性類型。 例如
public void run(Object bean, String propertyName) {
Foo foo = new Foo();
foo.test(PropertyUtils.getProperty(bean, propertyName));
}
BTW, PropertyUtils.getProperty()
是一個輔助方法,它返回bean上指定屬性的值。 PropertyUtils.getProperty()
返回一個Object,因此將始終調用test(Object value)
並忽略實際的屬性類型。
我可以在運行時中找出propery類型,即使它的值為null。 在Java中有動態轉換這樣的東西嗎? 如果沒有,是否有一種方法可以使用正確的參數類型調用重載方法?
覆蓋是Java中的動態綁定。 重載具有靜態綁定,並且調用哪個函數是在編譯時確定的,而不是在運行時確定的。 看到這個問題。
因此,您不能使用重載進行運行時選擇方法。 建議你在java中使用其他OOP設計模式之一,或者至少是instanceof
:
public void dispatch(Object o)
{
if (o instanceof String)
handleString((String)o);
else if (o instanceof File)
handleFile((File)o);
else
handleObject(o);
}
這是訪客模式的工作。
在Java中編譯時發生重載的方法解析。 您必須自己完成解決方案(交換機,if-then-else梯形圖或表查找),或者找到可以用Java實現的不同模式。
我不確定你想要回答這個問題。 你有興趣建立一個情況
test((String)x)
不做同樣的事情
test((Object)x)
對於x
是String
s。 這是一個壞主意™,只會導致很多混亂。 如果您真的想要不同的行為,請使用不同的方法名稱。
如果x
是一個String
,只需使test(Object x)
dispatch to test(String x)
,然后你就不必擔心調用哪個test
方法了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.