泛型函数

时间:2017-04-03 10:02:50

标签: java python generics

我最近在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中是不可能的?或者我使用错误的函数来获得所需的类名?

2 个答案:

答案 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
如果对象是trueType

的子类,则

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";
    }
}