如何确定Java泛型是否实现特定接口?

Mik*_*der 3 java generics

如何确定Java泛型是否实现特定接口?

我尝试了几种不同的方法,但它们都导致了"无法找到符号......变量T"的错误.

第一次尝试

public abstract class AbstractClass<T> {
    public void doFoo() {
        if (T instanceof SomeInterface){
            // do stuff
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

第二次尝试

public abstract class AbstractClass<T> {
    public void doFoo() {
        if (SomeInterface.class.isAssignableFrom(T)) {
            // do stuff
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Tun*_*aki 7

你不能.

解决方法1

使用对象的类添加构造函数.

public abstract class AbstractClass<T> {

    private Class<T> clazz;

    public AbstractClass(Class<T> clazz) {
        this.clazz = clazz;
    }

    public void doFoo() {
        if (clazz instanceof SomeInterface){
            // do stuff
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

解决方法2

一个约束添加到所述类型TT extends SomeInterface,从而限制类型T是的子类型SomeInterface.

public abstract class AbstractClass<T extends SomeInterface> {
    public void doFoo() {
        // do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)


Mak*_*oto 6

绑定它.

public abstract class <T extends SomeInterface> { }
Run Code Online (Sandbox Code Playgroud)

然后你保证它至少 SomeInterface在作为方法的参数传递时.

从您的方法来看,没有办法做到这一点,因为您没有引用T代码中任何位置的实例.如果你为它添加了一个参数,你至少可以得到更多.

public void doFoo(T obj) { }
Run Code Online (Sandbox Code Playgroud)