如何在使用泛型的方法中返回不同的类型?

要知道:

我想使用泛型在Java中返回不同的类类型,但是有一个错误。

这些返回值具有唯一的字段,因此我不想将其父类用作返回类型。

这是代码:

public class Client {
    public static void main(String[] args) {
        Client c = new Client();
        A a = c.gets(1);
        System.out.println(a.aFiled);
        B b = c.gets(2);
        System.out.println(b.bFiled);
    }


    public <T extends Root> T gets(int type) {
        switch (type) {
            case 1:
                return new A();
            case 2:
                return new B();
            default:
                throw new RuntimeException();
        }
    }


    class Root {
        String name;
    }

    class A extends Root {
        int aFiled;
    }

    class B extends Root {
        int bFiled;
    }
}


错误发生在内部 switch

“不兼容的类型”
必需:T
找到的:Client.A

我的意思是返回someclass扩展Root,我不知道为什么它是错误的。
如果有人可以向我解释,我将不胜感激。

Kartik:

在通用方法中,类型由编译器使用实际参数来推断。但是您的参数没有任何类型T。您可以发送另一个参数Class<T>来告诉返回值的类型:

public <T extends Root> T gets(int type, Class<T> c) {
    switch (type) {
        case 1:
            return c.cast(new A());
        case 2:
            return c.cast(new B());
        default:
            throw new RuntimeException();
    }
}

但是在您的情况下,在调用此方法之前您不知道类型。

因此,您所能做的就是使此方法变为非泛型并将返回类型更改为just Root然后,您可以进行instanceof检查以识别类,执行强制转换,然后获取相关字段。

无论如何,使该方法通用是没有意义的,因为通用方法可以与提供的不同类型的数据一起使用。但对于您而言,它始终是int所以我想说您的方法不是真正的通用方法

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在返回类型使用通配符从定义泛型类型有什么不同?

如何继承具有不同泛型返回类型的方法

如何在 Roslyn 中检查方法参数类型/返回类型是否为泛型?

mypy:如何在泛型类中声明返回 self 的方法的返回类型?

如何在Scala中使用嵌套的泛型类型作为方法返回类型

如何在TypeScript中返回泛型类型

如何强制使用静态泛型方法的返回类型?

如何使用主类中的方法从嵌套类中返回泛型类型

如何使用泛型返回python中的类类型?

如何创建泛型方法以返回泛型类型

如何使用泛型返回泛型类的类类型?

如何使用反射调用具有泛型返回类型的泛型方法

如何在泛型方法中获取具体类型

您如何在Java中调用泛型类型的方法?

如何在泛型方法中引用类型参数的值

如何在派生类型中使用泛型方法

如何在接口的方法中使用泛型类型参数

如何在扩展方法中使用泛型类型成员?

是否可以根据泛型类中使用的泛型类型是值还是引用类型,从泛型类中的函数返回不同的类型?

java中的泛型类型:如何定义一个返回多个不同类型的函数

如何在Java8中使用流返回特定类型的数组而不是泛型类型的数组

如何在非泛型静态类的多个方法中使用相同的泛型类型

泛型方法返回泛型类型

返回泛型类型的泛型方法

用于返回类的不同泛型类型的实例的单个方法

如何在具有泛型参数和返回类型方法的Java中使用反射获取类的实例?

如何在TypeScript中显式定义泛型返回类的返回类型?

在C#中的基类中使用泛型:如何确保基类中的方法返回派生类的类型?

在Swift中,方法如何返回泛型?