public class Test<T>{
public boolean isMember(T item) {
if(item instanceof Test)
{
return true;
}
return false;
}
}
这是检查项目是否是该类实例的正确方法吗?
我经历了一些搜索,似乎对于通用类,这不起作用。
答案 0 :(得分:5)
目前还不清楚你在这里尝试测试的内容,但这里有几种可能性:
item
是T
吗?是。否则,它可能无法传递到isMember
方法。编译器会禁止它。 (请参阅以下评论中的Alex警告。) item
是Test
吗?您编写的isMember
方法会对此进行测试,但我在此处感知代码气味。为什么您期望T
也是Test
,但只有部分时间?您可能想重新考虑如何组织课程。此外,如果这真的是你想要的,那么你的方法可以写成:
public boolean isMember(T item) {
return (item instanceof Test);
}
这引出了一个问题:为什么首先要有这样的方法?哪个更容易写?
if(obj instanceof Test) {...}
或
if(Test<Something>.isMember(obj)) {...}
我认为第一个更简单,大多数Java开发人员都会比自定义方法更容易理解它的含义。
item
是Test<T>
吗?在运行时无法知道这一点,因为Java使用擦除来实现泛型。如果这是您想要的,您必须修改方法签名,就像Mike Myers的例子一样。
答案 1 :(得分:0)
T
不是变量,而是在运行时定义的类的占位符。泛型是一个编译时功能,因此他们在编译时添加了检查,这在运行时可能没有任何意义。我们只能检查运行时引用的对象的类型,它可能是代码中的超类类型。如果我们想将类型T
作为参数传递给方法,我们所要做的就是明确地如下所示:
void genericMethod(Class<T> tClass) {
if(String.class.isAssignableFrom(tClass))
或
void genericMethod(Class<T> tClass, T tArg) {
请注意,类型可能与此处不同,我们可以看到如何操作:
genericMethod(Number.class, 1);
答案 2 :(得分:0)
公共类LinkList {
public boolean isMemberOfClass(T item) {
if(item instanceof LinkList)
{
return true;
}
return false;
}
}
对不起,我不打算将问题作为答案发布。
类LinkList是一个泛型类。 该功能是检查该项是否属于该类。检查是否有相同的T。