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;
}
...