如何从泛型方法中调用非泛型方法

4
如何从泛型方法中调用非泛型方法:
    class Test {
        ...
        public <T> int someFunction1(T someParam) {
            return someFunction2(someParam);
        }

        public int someFunction2(String someParam) {
           return 1;
        }

        public int someFunction2(Integer someParam) {
        return 1;
        }
    }

 Test t = new Test;
t.someFunction1(new String("1"));
t.someFunction1(new Integer(5));

“是否可能在编译时而非运行时完成此操作?”

请提供更多关于问题的信息:http://stackoverflow.com/help/how-to-ask - Mickael
正如我在答案中所说,你可以以某种方式做到这一点,但这听起来像是“糟糕的设计”。所以问题反过来问你:你打算用这种方式解决什么样的问题? - GhostCat
这种做法在C++中并不被认为是不好的,对吧?我只是想知道在Java中是否也可以这样做。 - Vardan Hovhannisyan
4个回答

5
编译器无法确定 someFunction1 中的 someParam 是一个 String 还是一个 Integer。可以尝试这样改写代码:
public <T extends String> int someFunction1(T someParam) {
    return someFunction2(someParam);
}

public int someFunction2(String someParam) {
    return 1;
}

如果你想让它成为String/Integer,你需要创建一些数据类型或者创建重载定义someFunction1,其中T绑定到Integer
或者只需要一些“丑陋”的转换:
public <T> int someFunction1(T someParam) {
    if (someParam instanceof Integer)
        return someFunction2((Integer) someParam);
    else if (someParam instanceof String)
        return someFunction2((String) someParam);
    else throw new IllegalArgumentException("Expected String or Integer")
}

4

您需要检查参数类型,并根据其类型显式转换并调用正确的方法:

public <T> int someFunction1(T someParam) {
    if (someParam instanceof Integer)
        return someFunction2((Integer)someParam);
    else if (someParam instanceof String)
        return someFunction2((String)someParam);
    else
        throw new InvalidArgumentException("Unexepected type: "+someParam.getClass());
}

我们能在编译时做同样的事情吗? - Vardan Hovhannisyan
@VardanHovhannisyan:你的意思是解决类型吗?请注意,这是不可能的,因为方法无法知道它将被调用的上下文。以上是唯一的方法。 - Zbynek Vyskovsky - kvr000
@VardanHovhannisyan 你是怎样调用 someFunction1 的?你是否有对 IntegerString 等的引用,还是只有一个 Object?如果是前者,你可以将所有的 someFunction2 重载简单地重命名为 someFunction1;在擦除后,someFunction1(String) 重载比 someFunction1(T) 更具体,因此将被优先选择。如果没有,那么你只能使用 instanceof 检查。 - Andy Turner

0

泛型并没有增加任何东西。您可以(而且应该)从方法中删除类型变量,而不会改变行为:

public int someFunction1(Object someParam) {

然后应用其他答案中提出的if/elseinstanceof链之一。


0

这个答案只适用于参数始终为字符串或整数的情况。

public <T> int someFunction1(T someParam) {
    try {
        return someFunction2((String) someParam);
    } catch (ClassCastException e) {
        try {
            return someFunction2((int) someParam);
        } catch (ClassCastException ex) {
            return 0;
        }
    }
}

顺便说一下:这是一个非常糟糕的“解决”问题的方式。与其他语言不同,Java 中不使用异常来处理此类情况。 - GhostCat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接