Java泛型参数作为确切的子类?

标签 java reflection wildcard

假设我们有这样的方法:

public void foo(Class<? extends ClassBar> x) {
    ...
}

通过修改通用表达式;

< ? extends ClassBar >

是否有可能确保 ClassBar.class 不会被传入,但任何直接或间接扩展 ClassBar 的东西都会被传入 WITHOUT 并在运行时抛出异常?

最佳答案

如果您只有一堆扩展 ClassBar 的类,您可以遵循这两种方法。


解决方案一:

ClassBar 的所有子类扩展自定义的 interface(ClassBar 本身除外),并将方法签名更改为:

public <T extends ClassBar & MyInterface> void foo(Class<T> x) {
    ...
}

解决方案 2:

使用类似于 this @AndyTurner's trick 的东西并仅为特定类型提供实例。

例如:

class ClassBar {}

class ClassBarA extends ClassBar{}
class ClassBarB extends ClassBar{}

你的包含foo:

class Foo<T extends ClassBar> {
    private Foo() {} // private constructor

    public static <T extends ClassBarA> Foo<T> instance(T c) {
        return new Foo<T>();
    }

    public static <T extends ClassBarB> Foo<T> instance(T c) {
        return new Foo<T>();
    }

    public void foo(Class<T> c) {

    }

}

在这种情况下,只接受 ClassBarA 的子类

Foo<ClassBarA> foo1 = Foo.instance(this.classBarA);
foo1.foo(ClassBarA.class); // pass
foo1.foo(ClassBar.class);  // fail

关于Java泛型参数作为确切的子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49052622/

相关文章:

Java 控制台在 AMD 64 位平台上无法运行 : Can't load IA 32-bit . dll

c# - C#中的函数指针

java - 访问该类的一般对象上的类变量

Javascript:获取字符串中第一个特殊正则表达式字符的索引

java - 如何处理 JPA 多对一关系?

java - Stream API 按名称区分,按值区分最大值

java - 基于对象属性对 ArrayList 进行排序

c# - Expression.Bind() - 它实际上做了什么?

java - 这个 Java 类型层次结构是否正确?

Bash shell...查找命令...带通配符的名称...别名或函数