如何实现List <mytype>?</mytype>

时间:2012-04-11 14:36:07

标签: java generics

我怎样才能让这种事情发挥作用?我可以检查(obj instanceof List<?>)是否(obj instanceof List<MyType>)。有没有办法可以做到这一点?

8 个答案:

答案 0 :(得分:43)

这是不可能的,因为在泛型的编译时数据类型擦除。只有这样做的可能方法是编写一种包含列表所包含类型的包装器:

public class GenericList <T> extends ArrayList<T>
{
     private Class<T> genericType;

     public GenericList(Class<T> c)
     {
          this.genericType = c;
     }

     public Class<T> getGenericType()
     {
          return genericType;
     }
}

答案 1 :(得分:24)

if(!myList.isEmpty() && myList.get(0) instanceof MyType){
    // MyType object
}

答案 2 :(得分:8)

您可能需要使用反射来获取要检查的类型。 要获取List的类型: Get generic type of java.util.List

答案 3 :(得分:4)

如果您要检查objectList<T>的实例,这是非空的,则可以使用此选项:

if(object instanceof List){
    if(((List)object).size()>0 && (((List)object).get(0) instanceof MyObject)){
        // The object is of List<MyObject> and is not empty. Do something with it.
    }
}

答案 4 :(得分:0)

如果要验证Object的List或Map值的引用是否是Collection的实例,只需创建一个必需List的实例并获取其类......

Set<Object> setOfIntegers = new HashSet(Arrays.asList(2, 4, 5));
assetThat(setOfIntegers).instanceOf(new ArrayList<Integer>().getClass());

Set<Object> setOfStrings = new HashSet(Arrays.asList("my", "name", "is"));
assetThat(setOfStrings).instanceOf(new ArrayList<String>().getClass());

答案 5 :(得分:0)

如果这不能用泛型(@Martijn的答案)包装,最好不要进行强制转换以避免冗余列表迭代(检查第一个元素的类型保证什么都没有)。 我们可以在迭代列表的代码段中转换每个元素。

Object attVal = jsonMap.get("attName");
List<Object> ls = new ArrayList<>();
if (attVal instanceof List) {
    ls.addAll((List) attVal);
} else {
    ls.add(attVal);
}

// far, far away ;)
for (Object item : ls) {
    if (item instanceof String) {
        System.out.println(item);
    } else {
        throw new RuntimeException("Wrong class ("+item .getClass()+") of "+item );
    }
}

答案 6 :(得分:0)

您可以使用假工厂包含许多方法,而不是使用instanceof:

public class Message1 implements YourInterface {
   List<YourObject1> list;
   Message1(List<YourObject1> l) {
       list = l;
   }
}

public class Message2 implements YourInterface {
   List<YourObject2> list;
   Message2(List<YourObject2> l) {
       list = l;
   }
}

public class FactoryMessage {
    public static List<YourInterface> getMessage(List<YourObject1> list) {
        return (List<YourInterface>) new Message1(list);
    }
    public static List<YourInterface> getMessage(List<YourObject2> list) {
        return (List<YourInterface>) new Message2(list);
    }
}

答案 7 :(得分:0)

    if (list instanceof List && ((List) list).stream()
                                             .noneMatch((o -> !(o instanceof MyType)))) {}