【问题标题】:How to invoke a method with generic return type in java如何在java中调用具有通用返回类型的方法
【发布时间】:2016-12-02 00:26:28
【问题描述】:

我想要一个返回泛型类型的方法。假设我有一个父类和 10 个子类。父类没有定义任何方法,子类具有不同的功能(它们没有共同点)。我想根据一些输入创建一个子类的对象。 (无法创建父对象,因为我无法调用类的方法)。所以我想编写一个在其中创建对象并在主函数中返回的函数。我想将 T 作为返回类型。如何从 main 调用。

public static <T> T fun() {
    if (some condition) {
        return new Class1();
    } else {
        return new Class2();
    }
}

如何为正确的类调用函数?

Class xyz = fun();

【问题讨论】:

  • 通过使“某些条件”为真或假来做到这一点不是很明显吗?
  • 这不是有效的 Java,因为该方法缺少返回类型。它也不起作用,因为Class1Class2 都与T 不兼容,假设您要返回类型T。如果返回类型不应该是T,那么T 的意义何在?
  • 看那里的代码,我猜你并不完全理解泛型以及它们能做什么。你真正想做什么?
  • 我想要做的是返回一个class1或class2的对象并将它分配给另一个函数中的一个对象。
  • 我想返回类型 T。我已将 T 添加为返回类型,是的,我是泛型新手

标签: java generics dynamic types generic-programming


【解决方案1】:

你应该将你想用作响应的类类型作为参数传递

public <T> T getAsObject(Class<T> clazz) {
    T bean = null;
    try {
        // do whatever you want to assign bean
    } catch (Exception e) {
        try {
            bean = clazz.newInstance();
        } catch (Exception ex) {
            // some log
        }
    }
    return bean;
}     

所以你可以将它与从用作参数的类继承它的类一起使用

例如:

public abstract class Parent {

    public Parent() {
    }

    public abstract void doit();
}

public class Child1 extends Parent {

    @Override
    public void doit() {
        // do something
    }
}

public class Child2 extends Parent {

    @Override
    public void doit() {
        // do other something
    }
}

现在你可以像这样使用它了:

Parent parent = getAsObject(Child1.class);
// or 
Parent parent2 = getAsObject(Child2.class);

【讨论】:

    猜你喜欢
    • 2013-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-11
    • 2021-02-14
    相关资源
    最近更新 更多