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

3

我该如何确定一个Java泛型是否实现了特定的接口?

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

第一次尝试

public abstract class AbstractClass<T> {
    public void doFoo() {
        if (T instanceof SomeInterface){
            // do stuff
        }
    }
}

第二次尝试

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

你不能这样做。请参见此处 - Mena
@Mena是正确的。虽然我在Java中没有特定的泛型经验(我是C#程序员),但我建议您仅使用类型约束使if始终为真。如果您需要多个这样的if,那将表明某些设计缺陷。 - MarioDS
2个回答

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
        }
    }
}

解决方法2

对类型 T 添加一个约束,即 T extends SomeInterface,从而将类型 T 限制为 SomeInterface 的子类型。

public abstract class AbstractClass<T extends SomeInterface> {
    public void doFoo() {
        // do stuff
    }
}

6

把它限制在一个范围内。

public abstract class <T extends SomeInterface> { }

如果作为参数传递给方法时,您可以保证它至少是SomeInterface

从您的方法来看,由于代码中没有引用到T的实例,因此无法进行操作。如果您添加一个参数,那么就至少能够获得更多的进展。

public void doFoo(T obj) { }

很不幸,对我来说,T不能保证扩展我感兴趣的接口。 - Mike Rylander
这对我来说是代码异味...为什么这个类会接受与您感兴趣的接口不同质的类型? - Makoto
在我的情况下,这个类接受T,这意味着它也接受S(S扩展T);如果这个类是类型S,那么就会有一些额外/不同的代码。是的,这段代码可能看起来有点奇怪,但这是我现在必须处理的。 - Mike Rylander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接