如何在Java中调用参数化方法?

时间:2016-04-21 14:18:17

标签: java generics

我有这样一种方法:

     AuthResponse ar = HomerClient.postRequest(url + "/api/v1/session", auth);

一切正常,但我无法弄清楚如何称呼它...... 我试过了:

    function loadAllPost() {
        var divs  = $("#posts");

        $.get("twitor.php?action=last", function() {
            var posts = [];
            for(var i = 0; i < posts.length; i++) {
                var newPost = addNewPost(posts[i].name, posts[i].text, posts[i].date);
                posts.push(newPost);
            }
            divs.children().remove();
            divs.append(posts);
        });

    }


    $(function() {
        loadAllPost();
        setInterval(loadAllPost, 5000);
        $("#submit").click(function() {
            var newPostName = $("#name").val();
            var newPostText = $("#text").val();
            var newPostDate = (new Date()).toLocaleString();
            var newPost = addNewPost(newPostName, newPostText, newPostDate);
            newPost.hide();
            $("#posts").append(newPost);
            newPost.slideToggle();

            $("name").val("");
            $("text").val("");

            $.post("twitor.php?action=new", {
                text: newPostText,
                name: newPostName
            });
        });
    });

最后一个表达式无法编译。

如何在Java中调用参数化方法?

AuthResponse扩展了HomerMessage

3 个答案:

答案 0 :(得分:2)

您需要提供类的名称,其中定义了static方法:

Exception ar = SomeClass.<Exception>getException();

答案 1 :(得分:2)

您的代码无法编译,因为它没有返回AuthResponse:它返回HomerMessage

如果将方法的返回类型更改为:

,则可以返回类型AuthResponse
private static <T extends HomerMessage> T postRequest(
    String path, HomerMessage json, TypeReference<T> typeRef)
        throws IOException, HomerDoh

这是您唯一正常完成的代码路径的返回类型。

如@SLaks所述,您不能将TypeReference与泛型一起使用:

new TypeReference<T>() {}

由于擦除,这在运行时将等同于:

new TypeReference<Object>() {}

这几乎肯定不是你想要的 - 否则你可能只是使用了它,而不是首先调用泛型方法的问题。

您需要实际传递具体的TypeReference作为参数:

private static <T extends HomerMessage> T postRequest(
    String path, HomerMessage json, TypeReference<T> typeRef)
        throws IOException, HomerDoh

然后你可以简单地称之为:

AuthResponse response = postRequest(
    url + "/api/v1/session", auth,
    new TypeReference<AuthResponse>() {});

,类型T是从第三个参数推断出来的。

答案 2 :(得分:1)

表达式Exception ar = <Exception>getException();无法编译,因为在参数化之前,泛型方法参数化习惯用法需要类名(如果方法不是静态的,则需要变量名)。

例如:

Exception ar = MyClass.<Exception>getException();

例如方法:

  • Exception ar = theObject.<Exception>getException();
  • Exception ar = this.<Exception>getException();