我有以下方法:
public <U, V> boolean isEqual(List<U> a, List<V> b) {
// check if U == V
}
我想检查U
和V
是否属于同一类。
答案 0 :(得分:8)
你不能这样做because of type erasure,就这么简单。
请考虑以下事项:
while($row = $result->fetch_assoc()) {
echo 'Email <input type="hidden" name="emailtype[]" id="" value="' . $row["emailtypeID"] . '"/>' . $row["emailtype"];
echo '<input type="text" name="email[]" id="" /><br />';
if($row["emailtype"] == 'secondario' || $row["emailtypeID"]==2){
echo 'Email <input type="hidden" name="emailtype[]" id="" value="' . $row["emailtypeID"] . '"/>' . $row["emailtype"];
echo '<input type="text" name="email[]" id="" /><br />';
}
}
这里有public static void main(String[] args) {
List<? extends Number> l1 = Arrays.asList(1L, 2, 3L);
List<? extends Number> l2 = Arrays.asList(1);
isEqual(l1, l2);
}
public static <U, V> boolean isEqual(List<U> a, List<V> b) {
// is U == V here?
}
吗? U == V
包含l1
和Long
个实例,但Integer
包含一个l2
个实例。
我猜测你的评论:
第一个条件应该是它们的类型是相同的
你应该拥有的是单一类型Integer
。在这种情况下,请使用以下签名:
U
然后,上面的代码不再编译。
您还可以添加2个接受类的参数:
public static <U> boolean isEqual(List<U> a, List<U> b) {
}
在这种情况下,如果给出的类不相同,则可以打印消息。
答案 1 :(得分:2)
如果您正在创建自己的课程,则可以要求Class<T>
包含在构造函数中,如演示here
例如:
public class SomeClass<T> {
private final Class<T> clazz;
public SomeClass(Class<T> clazz) {
this.clazz = clazz;
}
public Class<T> getParam() {
return clazz;
}
}
现在您可以调用SomeClass#getParam()
来获取声明的类型参数。
还有a way to do this with reflection.
所有这些都说,你必须对此进行奇怪的解决方法是因为Type Erasure。基本上在运行时,Java将所有泛型都视为Object
,因此在编译List
时可能是List<Integer>
或List<Boolean>
,但在运行时它们都是List<Object>
答案 2 :(得分:1)
如果您正在尝试比较两个列表的内容,那么您不应该自己实现类型比较。相反,你应该这样做:
public static <U, V> boolean isEqual(List<U> a, List<V> b) {
if (a.size() != b.size())
return false;
for (int i = 0; i < a.size(); i++)
if (!a.get(i).equals(b.get(i)))
return false;
return true;
}
这样你就可以依靠U和V类型来正确处理equals()。以下是实施equals()的一些指导原则:http://www.javaworld.com/article/2072762/java-app-dev/object-equality.html
我猜你想要做的是能够在类型不同的情况下快速返回。但是通过我给你的实现,你会得到相同的行为 - 你会在第一次迭代时返回。
答案 3 :(得分:0)
不要依赖
a.getClass().equals(b.getClass())
这是不正确的,它只会检查两者是否为ArrayList类型而不是String,Integer等。
仅限试用
a.get(0).getClass().equals(b.get(0).getClass())
确保检查null条件,否则在这里会遇到NullPointerException。
答案 4 :(得分:0)
我想你想检查a == b而不是U == V.在这种情况下,你必须编写自己的比较方法来比较U类和V类的实例。
答案 5 :(得分:-1)
假设a和b不为空且不为空,
a.get(0).getClass().equals(b.get(0).getClass())
应该这样做。