Java-带列表的泛型

Java-带列表的泛型,java,generics,Java,Generics,我为缓存编写了一个函数来检索特定对象。这样我就不用投了 @SuppressWarnings("unchecked") public static <T> T inCache(Class<T> obj, String token) { Object cacheObj = Cache.get(token); if (cacheObj != null) { if (obj.isAssignableFrom(ca

我为缓存编写了一个函数来检索特定对象。这样我就不用投了

@SuppressWarnings("unchecked")
    public static <T> T inCache(Class<T> obj, String token) {

        Object cacheObj = Cache.get(token);
        if (cacheObj != null) {

            if (obj.isAssignableFrom(cacheObj.getClass())) {
                return (T) cacheObj;
            }
        }
        return null;

    }
但是现在我的缓存中有一个字符串列表,我不能像这样使用它

String s = inCache(String.class, title);
List<String> ipList = Util.inCache(List<String>.class, title);
List-ipList=Util.inCache(List.class,title);

问题在于
列表.class
。我对java非常陌生,我必须如何编写它?

java中有一个称为类型擦除的概念。由于遗留的原因,类似列表的东西只是一个列表。它不记得在运行时它是一个字符串列表。你应该写List.class


然后,在遍历列表时,您可以在列表中指定对象的类型。

您无法获取
列表的类,在您的情况下,唯一的方法是:

List<String> ipList = (List<String>)Util.inCache(List.class, title);
List-ipList=(List)Util.inCache(List.class,title);
您可以尝试:

List<String> ipList = Util.inCache(List.class, title);
List-ipList=Util.inCache(List.class,title);
试试这个-

List<String> inList = (List<String>)Test.inCache(List.class, title);
List inList=(List)Test.inCache(List.class,title);
你也可以做-

List<String> inList = Test.inCache((Class<? extends List<String>>)List.class, token);

List inList=Test.inCache((Class只是为了澄清Joe的答案(我没有足够的声誉来评论),在运行时,
List
List
或任何其他类型的
List
之间没有区别,泛型在运行时不会保留

意思是,
List.class
List.class
完全相同,实际上是
List.class
。这是Java类型系统的一个弱点。我不熟悉一种简单的方法来实现您想要的

这是一个很好的代码证明:

// It is true that      
    List<String> stringList = new ArrayList<String>(); 
    List<Integer> integerList = new ArrayList<Integer>();                                               
    System.out.println( stringList.getClass() == integerList.getClass()  );

    // And that ... 
    List objectList = new ArrayList();
    System.out.println( stringList.getClass() == objectList.getClass()  );

    //However, the following is false because a different implementation is used ( I wanted a false case)
    List objectLinkedList = new LinkedList();
    System.out.println(  objectLinkedList.getClass() == objectList.getClass() );
//的确
List stringList=新建ArrayList();
List integerList=new ArrayList();
System.out.println(stringList.getClass()==integerList.getClass());
//而且。。。
List objectList=new ArrayList();
System.out.println(stringList.getClass()==objectList.getClass());
//但是,以下是错误的,因为使用了不同的实现(我想要一个错误的案例)
List objectLinkedList=新建LinkedList();
System.out.println(objectLinkedList.getClass()==objectList.getClass());

作为旁注,您不需要使用suppresswarnings,而是使用带有不可避免的suppresswarnings的
return obj.cast(cacheObj)