检查item是否是泛型类的实例

时间:2012-08-28 15:17:27

标签: java class generics instanceof

public class Test<T>{

    public boolean isMember(T item) {

        if(item instanceof Test)
        {
            return true;
        }
        return false;
    }
}

这是检查项目是否是该类实例的正确方法吗?

我经历了一些搜索,似乎对于通用类,这不起作用。

3 个答案:

答案 0 :(得分:5)

目前还不清楚你在这里尝试测试的内容,但这里有几种可能性:

  1. itemT吗?是。否则,它可能无法传递到isMember方法。编译器会禁止它。 (请参阅以下评论中的Alex警告。)
  2. itemTest吗?您编写的isMember方法会对此进行测试,但我在此处感知代码气味。为什么您期望T也是Test,但只有部分时间?您可能想重新考虑如何组织课程。此外,如果这真的是你想要的,那么你的方法可以写成:

    public boolean isMember(T item) {
        return (item instanceof Test);
    }
    

    这引出了一个问题:为什么首先要有这样的方法?哪个更容易写?

    if(obj instanceof Test) {...}
    

    if(Test<Something>.isMember(obj)) {...}
    

    我认为第一个更简单,大多数Java开发人员都会比自定义方法更容易理解它的含义。

  3. itemTest<T>吗?在运行时无法知道这一点,因为Java使用擦除来实现泛型。如果这是您想要的,您必须修改方法签名,就像Mike Myers的例子一样。

答案 1 :(得分:0)

T不是变量,而是在运行时定义的类的占位符。泛型是一个编译时功能,因此他们在编译时添加了检查,这在运行时可能没有任何意义。我们只能检查运行时引用的对象的类型,它可能是代码中的超类类型。如果我们想将类型T作为参数传递给方法,我们所要做的就是明确地如下所示:

void genericMethod(Class<T> tClass) {
    if(String.class.isAssignableFrom(tClass)) 

void genericMethod(Class<T> tClass, T tArg) {

请注意,类型可能与此处不同,我们可以看到如何操作:

genericMethod(Number.class, 1);

答案 2 :(得分:0)

公共类LinkList {

public boolean isMemberOfClass(T item) {

    if(item instanceof LinkList)
    {
        return true;
    }
    return false;
}

}

对不起,我不打算将问题作为答案发布。

类LinkList是一个泛型类。 该功能是检查该项是否属于该类。检查是否有相同的T。