【问题标题】:check if item is instance of a generic class检查 item 是否是泛型类的实例
【发布时间】:2012-08-28 15:17:27
【问题描述】:
public class Test<T>{

    public boolean isMember(T item) {

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

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

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

【问题讨论】:

  • 您是否要测试该项目是Test 的实例、T 的实例还是Test&lt;T&gt; 的实例?
  • @NinjoeQuah 看看我的回答

标签: java class generics instanceof


【解决方案1】:

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

  1. itemT 吗?是的。否则,它可能无法传递给isMember 方法。编译器将不允许它。 (请参阅下面 cmets 中 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&lt;T&gt; 吗?在运行时无法知道这一点,因为 Java 使用擦除实现泛型。如果这是您想要的,您必须将方法签名修改为类似于 Mike Myers 的示例。

【讨论】:

  • "编译器不允许这样做。" - 假设您在对类的所有引用中使用正确的通用签名,这是真的。您仍然可以使用对原始类型 Test 的引用将不是 T 实例的项目传递给 isMember,但如果您这样做,编译器会向您抛出各种警告。
【解决方案2】:

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

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

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

注意类型可能和这里不一样我们可以看看如何操作:

genericMethod(Number.class, 1);

【讨论】:

    【解决方案3】:
    public class LinkList<T>{
    
        public boolean isMemberOfClass(T item) {
    
            if(item instanceof LinkList)
            {
                return true;
            }
            return false;
        }
    }
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-05
      • 1970-01-01
      • 2018-10-21
      • 2014-12-06
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 2019-06-25
      相关资源
      最近更新 更多