9
public class Test<T>{

    public boolean isMember(T item) {

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

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

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

4

3 回答 3

5

目前尚不清楚您要在这里测试什么,但这里有一些可能性:

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

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

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

    if(obj instanceof Test) {...}
    

    或者

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

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

  3. item一个Test<T>?在运行时无法知道这一点,因为 Java 使用擦除实现泛型。如果这是您想要的,您必须将方法签名修改为类似于 Mike Myers 的示例。

于 2012-08-28T15:32:02.393 回答
0

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

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

或者

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

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

genericMethod(Number.class, 1);
于 2012-08-28T15:28:31.157 回答
-1
public class LinkList<T>{

    public boolean isMemberOfClass(T item) {

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

对不起,我不支持发布问题作为答案。

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

于 2012-08-29T15:33:33.487 回答