我最近在java中学习泛型,我脑海里浮现出一个问题,python程序员可以与之相关。我所做的只是创建一个通用的java函数,它应该返回一个字符串,并采用不同(或similer)泛型类型的2个参数“p1和p2”。但是棘手的是我想要返回p1的值,如果p1是String类型,否则是一般的String消息..这段代码的简单python实现将是:
def func1(a,b):
if type(a)==str:
return a
else:
return 'bye'
func1(2,5) #output: 'bye'
func1("hi",5) #output: 'hi'
我在java函数上尝试过相同的但是它似乎给出了一个错误,根据我的观察结果只有在强有力地(因为obj1已经被检查为一种字符串的类型)被强制转换为字符串时才能被纠正:
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";
}
}
那么,这里出了什么问题?它有点与python的“ducktyping”特性有关,在java中是不可能的?或者我使用错误的函数来获得所需的类名?
答案 0 :(得分:3)
这与python是动态类型的事实有关。
虽然你在这里检查了obj1
的类型:
if (obj1.getClass().getSimpleName()=="String"){
编译器在看到return语句时会忘记这一点。它会坚持obj1
属于T
但不属于String
,因此无法返回obj1
。
正如您所指出的,解决方法是将obj1
投射到String
。 Casting就像对编译器说的那样,&#34;我确信这是一个字符串!&#34;
P.S。您只需执行以下操作即可检查对象是否为字符串:
if (obj1 instanceof String)
答案 1 :(得分:0)
通常在Java中,您可以使用instanceof
来检查对象的类型:
someObject instanceof Type
如果对象是true
或Type
的子类,则为Type
否则你可以这样做:
someObject.getClass().equals(Type.class)
仅当对象为true
时,才为Type
在您的情况下,您可以同时使用:
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";
}
}