考慮下面的C++程序:模板和泛型。爲什麼我可以在C++中執行以下操作,但不能在Java中執行以下操作?我如何克服這一點?
#include <iostream>
using namespace std;
template<typename T>
class example
{
public:
void function (T a)
{
std::cout<<a.size();
}
};
int main() {
example<string> a; // this doesn't
string b = "a";
//example<int> a; This gives an error
a.function (b);
// your code goes here
return 0;
}
現在考慮下面的Java程序:
import java.util.ArrayList;
class example<T> {
public void function (T a)
{
System.out.println (a.toHexString(5)); /* this does not compile even when T is Integer */
}
}
public class Main
{
public static void main (String[] args)
{
example<Integer> a = new example<Integer>();
Integer b = 2;
a.function(b);
return;
}
}
我已經majorly是一個C++開發者到現在爲止和我學習Java的工作目的。所以,從模板工作的背景來看,泛型讓我感到困惑。
編輯我的問題:
在上述C++代碼,代碼編譯和如果我通過字符串作爲模板參數運行良好,因爲串確實有一個尺寸()方法。如果我使用int作爲模板參數,那麼可以理解,我會得到一個錯誤。這裏需要注意的是,如果我傳遞了一個名爲size()的方法的模板參數,C++允許我編譯和運行代碼。
但是,在Java代碼中,即使當我將Integer作爲通用參數(?是一個術語?)傳遞給Integer時,它也必須使用HexString(int)方法,但程序仍然無法編譯。它返回一個錯誤:
cannot find symbol
這裏有什麼問題?什麼阻止我在Java中實現這種行爲?
編輯:此問題已被標記爲另一個問題可能重複: How do I call a method of a generic type object? 我會複製粘貼到我的反應爲什麼我認爲這個問題的不同。 上面的問題'潛在'告訴我如何擺脫錯誤。我問的是什麼阻止我在Java中實現上述效果?上述問題給了我這種疾病的藥物,而不是原因。
我在## java上提了一個類似的問題,聽說有一個新術語 - 物化。我想知道這是否與此有關?
@Dukeling:不完全。上面的問題「可能」告訴我如何擺脫錯誤。我問的是什麼阻止我在Java中這樣做?上述問題給了我這種疾病的藥物,而不是原因。 – Paagalpan
您標記的線不是導致錯誤的線。 – davmac
@davmac:已更正。 – Paagalpan