【问题标题】:Java: instanceof GenericJava:实例泛型
【发布时间】:2011-06-09 22:43:28
【问题描述】:

有没有办法找到泛型的类类型?

if (T instanceof String) {
    // do something...
}

上面肯定是编译不出来的。

【问题讨论】:

  • T 是否定义为泛型参数?请发布无法编译的整个代码...
  • 是的,T 是一个通用参数。这是您唯一需要的代码。
  • 请注意T 是一个类型,而不是一个变量。 instanceof 运算符的左侧只能使用变量。
  • 我很想将以下内容作为技术上正确的答案发布:void functionName(String T)... 在那里,您的代码有效:)

标签: java generics instanceof


【解决方案1】:

它不会编译,因为 T 不是变量,而是在运行时定义的类的占位符。这是一个快速示例:

public class Test<T> {

public void something(T arg) {
    if (arg instanceof String) {
        System.out.println("Woot!");
    }
}

public static void main(String[] args) {
    Test<String> t = new Test<String>();
    t.something("Hello");
}

}

【讨论】:

  • 我认为这在 java 中不起作用。请参阅 Jon Skeet 的回答 stackoverflow.com/questions/313584/…
  • @The Scrum Meister ,它适用于这种特定情况。我已经测试过了。
  • 这会起作用,因为您使用instanceof 来测试已知类型,而不是泛型。不起作用的是 if (foo instanceof T) 其中 foo 是一些变量,因为 T 表示的类型在编译时是未知的。
【解决方案2】:

泛型是一种编译时特性。泛型在编译时添加检查,这在运行时可能没有任何意义。这是一个例子。您只能检查引用的对象的类型,它可能是代码中的超类型。如果你想传递类型 T,你必须明确地这样做。

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

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

注意:类型可能不一样,

someMethod(Number.class, 1);

【讨论】:

  • 这是对我来说一次解决很多问题的答案之一。
  • 这是什么?例如我有T var,如何使用这种方法? someMethod(T) 不行……什么我不明白?
  • @user25 我不确定你不明白什么。你能澄清你的意思吗?对我来说,这听起来像是一个不同的问题。
  • @PeterLawrey stackoverflow.com/a/4704909/4548520 这对我有用。这个我知道如何使用:例如我有T var,然后我必须像这样检查类型:new Test&lt;T&gt;().something(var)
  • @user25 在这里你唯一能得到的是 var.getClass () 如果你这样做是没有办法得到 T 的。
【解决方案3】:

如果你有子类

public class SomeClass extends SomeSubclass&lt;String&gt;{}

public class SomeSubclass<T> {}

那么有一种方法可以通过执行代码来发现 T 的类型

Type t = getClass().getGenericSuperclass()
if (t instanceof ParameterizedType) {
    Type[] actualTypeArguments = ((ParameterizedType)t).getActualTypeArguments()
    // in simple cases actualTypeArguments will contain Classes, since Class implements Type
}

如果您的情况有点复杂 (? extends String)`,请查看 org.ormunit.entity.AEntityAccessor#extractClass

【讨论】:

    【解决方案4】:

    如果你有特定的字段,你可以像下面这样检查它:

    private <T> String someMethod(T genericElement)
    {
        if (String.class.isInstance(genericElement))
        {
            return (String) genericElement;
        }
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-18
      • 2016-08-03
      • 1970-01-01
      • 2015-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      相关资源
      最近更新 更多