Java泛型:将无界类型转换为有界类型

我有两个函数定义为

<T1 extends A> void func1(Class<T1> C);

<T2 extends B> void func2(Class<T2> C);

现在,用户将根据其提供的内容在运行时提供任何类型,我们需要调用func1或func2。我需要类似

的东西
<T> void func(Class<T> C){
    // check if Class C extends A,then call func1 else call func2
    if (T extends A){
        func1(C);
    }
    else{
        func2(C);
    }
}

我是Java Generics的新手,我想知道这是否可行?如果可能的话,我该怎么办?

iCMS 回答:Java泛型:将无界类型转换为有界类型

至少不是泛型。

泛型几乎完全是编译器想象力的体现。

在编译时,有泛型信息,但仅在您的眼球可以看到的范围内。如果我写:

class Example<T> {
    void foo(T in) {}
}

然后,仅看这段代码,您的眼球就无法判断在foo方法的任何给定调用下T将是什么。因此,编译器也无法告诉它们,因此在编译时您也不知道T是什么。您不能编写如下代码:“给我无论T是什么,也许以java.lang.Class实例的形式出现。”

在运行时,此信息不再存在-称为擦除。

运行时有一些泛型可用-基本上,任何时候泛型出现在签名中(即,字段的类型,在extendsimplements行中提到的任何类型,方法返回类型,任何方法参数类型)-您仍然可以在运行时获取它,但是您得到的只是代码中写的内容。

因此,一旦您问了一个问题:我可以以某种方式将jlClassInstance.isAssignableFrominstanceof之类的运行时概念与泛型绑定混合使用,答案是一个简单而平坦的问题:否。不可能。-但这正是您要的。

我确实提到了 PROVIDED ,所讨论的方法在其源代码中具有明确列出的类型,现在,它是签名的一部分,理论上您可以在以下位置进行查询:运行。因此,如果您有:

    <T extends Number> void func1(Class<T> c) { ... }
    <T extends List<?>> void func2(Class<T> c) { ... }

然后可以在运行时通过大量的麻烦和棘手的代码检索Number.classList.class。但是,您不应该这样做,这是泛型滥用。如果有人写了:

    class Foo<Y> {
        <T extends Y> void func3(Class<T> c) { ... }
    }

因为这样可以很好地进行编译,并且您的计划是:我将使用反射来检查实际的类型绑定,并使用它在运行时调度一些内容-在这里不起作用。在运行时,您将只能知道名称是“ T”,下界是“ Y”,“ Y”是封闭类型的无穷类型参数。

,

考虑以下问题:为什么Java提供了泛型?

提供了泛型以在编译时而非运行时检测更多类型强制转换错误。

现在让我们回到您的问题:

现在,用户将根据他需要的内容在运行时提供任何类型 调用func1或func2。

这与Java中提供的泛型完全相反,因为您想要在运行时提供任何类型,我建议您以一种用户无法在运行时将任何类型传递给您的方法的方式更改设计,这种设计是容易出错,这些错误将在运行时检测到!

本文链接:https://www.f2er.com/1643827.html

大家都在问