例如,在c ++中,我可以找到int = 0,vector< int> = 1,vector< <矢量< int> > = 2由以下内容:
#include <vector>
#include <stdlib.h>
template <typename T>
class Printer{
public:
static int print(){
return 0;
}
};
template <typename T,typename Alloc>
class Printer<std::vector<T,Alloc> >{
public:
static int print(){
return 1+Printer<T>::print();
}
};
int main(){
printf("%d\n",Printer<int>::print());
printf("%d\n",Printer<std::vector<int> >::print());
printf("%d\n",Printer<std::vector<std::vector<int> > >::print());
return 0;
}
不需要任何实例,例如:
std::vector<int> v;
这样做。如何在Java中实现此功能?我试过了:
public static void print(List<Integer> list){
}
public static <T> void print(List<? extends T> list) {
}
和
public static <T>void print(){
}
public static void print() {
}
但两者都说&#34;两种方法都有相同的擦除&#34;。我还考虑使用if else:
public static void print(Object obj) {
if(obj instanceof List){
List list=(List)obj;
for(Object obj2 : list){
print(obj2);
}
}else{
}
}
但是我无法获得函数中的元素类型。是否可以在Java中执行此操作?
答案 0 :(得分:0)
这是一个递归方法,可以完成你想要实现的目标。始终在初始调用时为depth
参数传递0,即计数器。
public static int listDepth(Object obj, int depth){
if(obj instanceof List){ //Check if given object is a list
List<?> list = (List)obj; //Retrieve the list
depth++; //Increment depth counter
if(list.isEmpty()) //Nothing in the current list
return depth; //Then return current depth
else depth = listDepth(list.get(0), depth);//Else call the method on the first element, with the current depth
}
return depth; //obj is not a List, we return the depth
}
这是一个例子:
ArrayList second = new ArrayList<String>();
ArrayList first = new ArrayList<ArrayList>();
first.add(second);
System.out.println(" Depth : " + listDepth(first, 0));// Output : 2
还有一个:
ArrayList third = new ArrayList<String>();
ArrayList second = new ArrayList<ArrayList>();
ArrayList first = new ArrayList<ArrayList>();
third.add("Not an array");
second.add(third);
first.add(second);
System.out.println(" Depth : " + listDepth(first, 0));// Output : 3
编辑:用一个检查替换了try / catch,或者列表是空的,因为这是一个更合适的方法。
答案 1 :(得分:-1)
在Java中,“T”将在编译时被删除。 如果您希望获得List的深度,则需要确保此List不为null。比得到第一个并检查该类。
public int getDepth(Object collection){
return getDepth(collection,1);
}
/**
* get Collection depth
* @param depth now depth
* @return
*/
private int getDepth(Object collection,int depth){
Object temp;
if(collection instanceof Collection
&& !((Collection)collection).isEmpty()){
//get first one
temp = ((Collection)collection).iterator().next();
return getDepth(temp,depth +1 );
}else {
return depth;
}
}
:)