Java:instanceof Generic

Java:instanceof Generic,java,generics,instanceof,Java,Generics,Instanceof,没有办法找到泛型的类类型吗 if (T instanceof String) { // do something... } 上述内容肯定不会编译。它不会编译,因为t不是变量,而是在运行时定义的类的占位符。下面是一个快速示例: public class Test<T> { public void something(T arg) { if (arg instanceof String) { System.out.println("Woot!");

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

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

上述内容肯定不会编译。

它不会编译,因为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");
}

}
公共类测试{
公共作废某物(T参数){
if(arg instanceof String){
System.out.println(“Woot!”);
}
}
公共静态void main(字符串[]args){
测试t=新测试();
t、 某物(“你好”);
}
}

泛型是一种编译时功能。泛型在编译时添加检查,这在运行时可能没有任何意义。这是一个例子。您只能检查引用的对象的类型,该类型可能是代码中的超级类型。如果要传递类型T,必须显式传递

void someMethod(Class<T> tClass) {
    if(String.class.isAssignableFrom(tClass)) 
如果你有子类

公共类SomeClass扩展SomeSubclass{}


如果您的案例有点复杂(
?extends String
)`请查看

,如果您有特定字段,您可以按如下方式进行检查:

private <T> String someMethod(T genericElement)
{
    if (String.class.isInstance(genericElement))
    {
        return (String) genericElement;
    }
...
私有字符串someMethod(T genericElement)
{
if(String.class.isInstance(genericElement))
{
返回(字符串)genericElement;
}
...

是否定义为泛型参数?请发布未编译的整个代码…是的,T是泛型参数。这是您唯一需要的代码。请参阅另请注意,
T
是一种类型,而不是变量。只有变量可以在
instanceof
运算符的左侧使用。我很想发布f下面是一个技术上正确的答案:void functionName(字符串T)…在这里,您的代码可以工作:)我认为这在java中不起作用。请参阅Jon Skeet的答案@The Scrum Meister,它适用于此特定情况。我已经测试过它。这将起作用,因为您使用
instanceof
来测试已知类型,而不是泛型。不起作用的是说
if(foo instanceof t)
其中
foo
是一个变量,因为
T
所代表的类型在编译时是未知的。这是一个答案,它一下子为我确定了一系列问题。这是什么?例如,我有
T var
以及如何将它与此方法一起使用?
somethod(T)
行不通……我不明白什么?@user25我不确定你不明白什么。你能澄清一下你的意思吗?对我来说这听起来像是一个不同的问题。@PeterLawrey这对我有用。这个我知道如何使用:例如,我有
t var
,然后我必须检查这样的类型:
new Test()。某物(var)
@user25这里唯一能得到的是var.getClass(),如果这样做,就无法得到T。
someMethod(Number.class, 1);
public class SomeSubclass<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
}
private <T> String someMethod(T genericElement)
{
    if (String.class.isInstance(genericElement))
    {
        return (String) genericElement;
    }
...