2017-04-03 19 views
1

最近私はjavaでジェネリックスを学んでいましたが、Pythonプログラマが関連しているとの疑問がありました。私がしたのは、文字列を返し、異なる(またはsimiler)ジェネリック型の2つのパラメータ "p1とp2"を取るジェネリックなJava関数を作成することでした。ジェネリック関数の一般的な操作

def func1(a,b): 
    if type(a)==str: 
     return a 
    else: 
     return 'bye' 

func1(2,5)    #output: 'bye' 
func1("hi",5)   #output: 'hi' 

は私が上に同じ試してみました。しかし、トリッキーな事は、私が...このコードのシンプルなPythonの実装はなりp1は、String型、それ以外の一般的な文字列のメッセージであれば、P1の値を返すようにしたいですそう

public static <T, T2> String func3(T obj1, T2 obj2) { 
    if (obj1.getClass().getSimpleName().equals("String")){ 
     return obj1;  //<--error //(String)obj1; <--is working 
    } 
    else{ 
     return "bye"; 
    } 
} 

:文字列に型変換(OBJ1はすでに文字列のタイプであることのためにチェックされているので、むしろ不必要)それは強制的であればJavaの関数が、私の観察によってのみ修正することができ、エラーを与えているようです何がここで間違っていますか?それはPythonの "ducktyping"機能に幾分関係していますか?javaでは可能ではありませんか?または、希望のクラス名を取得するために間違った機能を使用していますか?

答えて

3

これは、pythonが動的に型指定されているという事実に関連しています。

あなたはここでobj1のタイプにチェックが:

if (obj1.getClass().getSimpleName()=="String"){ 

それがreturn文を見たとき、コンパイラはこれについて忘れを。 obj1Tであるが、Stringでないことを主張するので、obj1は返却できません。

あなたが指摘したように、解決策は、obj1からStringです。キャストは、コンパイラに「これは文字列だと確信しています!」と言ったようなものです。

P.S.オブジェクトが文字列である場合は、単に行うことによって確認することができます。

if (obj1 instanceof String) 
0

は通常Javaであなたがinstanceof使用してオブジェクトの種類をcancheck:オブジェクトがTypeかである場合

someObject instanceof Type 

trueですType

のサブクラスでは、そうしないと、このような何かを行うことができます。

someObject.getClass().equals(Type.class) 

オブジェクトを使用して、両方を使用することができますあなたのケースではType

である場合にのみtrueです:

obj1 instanceof String 

または

obj1.getClass().equals(String.class) 

しかし、私は、Javaのように最初のソリューションです示唆最も使用。

あなたのケースでは私はこのような方法を記述します。

public static String func3(T obj1, T2 obj2) { 
    if(obj1 instanceof String){ 
     return (String)obj1;  
    } 
    else{ 
     return "obj1 not a String"; 
    } 
} 
+0

しかし、あなたはまだ型キャストが必要です。 – Wietlol

+0

確かに、質問は型比較にもっと関連していると思います。とにかく私は私の解決策を更新します。 – rakwaht

関連する問題