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

Java泛型:将无界类型转换为有界类型,java,generics,bounded-types,Java,Generics,Bounded Types,我有两个函数定义为 <T1 extends A> void func1(Class<T1> C); <T2 extends B> void func2(Class<T2> C); void func1(C类); 第二类(丙类); 现在用户将在运行时给出任何类型,根据他给出的,我们需要调用func1或func2。我需要类似的东西 <T> void func(Class<T> C){ // check if Cla

我有两个函数定义为

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

<T2 extends B> void func2(Class<T2> C);
void func1(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);
    }
}
void func(C类){
//检查类C是否扩展了A,然后调用func1,否则调用func2
if(T扩展A){
职能1(C);
}
否则{
职能2(C);
}
}

我是Java泛型新手,我想知道这是否可行?如果可能的话,我应该怎么做呢?

这不是,至少不是泛型

泛型几乎完全是编译器想象出来的

在编译时,泛型信息是存在的,但只是你的眼球所能看到的。如果我写:

class Example<T> {
    void foo(T in) {}
}
然后,在运行时,在经过大量的循环和复杂的代码之后,可以检索
Number.class
List.class
。但是,你不应该这样做,这是泛型滥用。如果有人写道:

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

因为这样可以很好地编译,而您的计划是:我将使用反射来检查实际的类型绑定,并使用它在运行时分派一些东西——在这里不起作用。在运行时,您在这里只能知道名称是“T”,其下限是“Y”,而“Y”是封闭类型的无边界类型参数。

它至少不是泛型

泛型几乎完全是编译器想象出来的

在编译时,泛型信息是存在的,但只是你的眼球所能看到的。如果我写:

class Example<T> {
    void foo(T in) {}
}
然后,在运行时,在经过大量的循环和复杂的代码之后,可以检索
Number.class
List.class
。但是,你不应该这样做,这是泛型滥用。如果有人写道:

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

因为这样可以很好地编译,而您的计划是:我将使用反射来检查实际的类型绑定,并使用它在运行时分派一些东西——在这里不起作用。在这里,您在运行时只能知道名称是“T”,其下限是“Y”,而“Y”是封闭类型的无边界类型参数。

考虑这个问题:为什么Java中提供泛型

泛型用于在编译时而不是运行时检测更多类型转换错误

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

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


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

考虑这个问题:为什么Java中提供泛型

泛型用于在编译时而不是运行时检测更多类型转换错误

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

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


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

你在寻找
如果(A的C实例)
?事实上,现在我想起来了,那可能不行,因为我们这里有
,所以
C
将始终是
C.isAssignableFrom(A.Class)或
A.Class.isAssignableFrom(C)
(永远不确定该方法的工作方式)其中,
C
是引用
对象的变量,
a
是class@codeflush.dev它是
A.class.isAssignableFrom(C)
。您可以从左到右阅读:A变量是否可以从C实例分配?@codeflush.dev即使我知道C从A.class.isAssinableFrom(C)扩展了A,我可以调用func1或func2吗??因为他们期望有界类型,而func中的所有类型都是无界类型。你在寻找
如果(A的C实例)
?事实上,现在我想起来了,这可能不行,因为这里有
Class
,所以
C
将始终是
Class
C.isAssignableFrom(A.Class)的一个实例
A.class.isAssignableFrom(C)
(永远不确定该方法的工作方式),其中
C
是引用
class
对象的变量,
A
是class@codeflush.dev它是
A.class.isAssignableFrom(C)
。您可以从左到右阅读:A变量是否可以从C实例分配?@codeflush.dev即使我知道C从A.class.isAssinableFrom(C)扩展了A,我可以调用func1或func2吗??因为他们期望有界类型,而func中只有无界类型