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

Nin*_*uah 9 java generics class instanceof

public class Test<T>{

    public boolean isMember(T item) {

        if(item instanceof Test)
        {
            return true;
        }
        return false;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我经历了一些搜索,似乎对于泛型类,这不起作用.

Str*_*ior 5

目前还不清楚你要在这里测试什么,但这里有几个可能性:

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

    public boolean isMember(T item) {
        return (item instanceof Test);
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

    if(obj instanceof Test) {...}
    
    Run Code Online (Sandbox Code Playgroud)

    要么

    if(Test<Something>.isMember(obj)) {...}
    
    Run Code Online (Sandbox Code Playgroud)

    我认为第一个更简单,并且大多数Java开发人员将比自定义方法更容易理解它意味着什么.

  3. item一个Test<T>?在运行时无法知道这一点,因为Java使用擦除来实现泛型.如果这是你想要的,你将不得不修改方法签名,就像迈克迈尔斯的例子.

  • "编译器会禁止它." - 假设您在所有类的引用中使用了正确的通用签名,这是正确的.您仍然可以使用对原始类型`Test`的引用将不是`T`实例的项传递给`isMember`,但是如果您这样做,编译器会向您抛出各种警告. (2认同)