代码之家  ›  专栏  ›  技术社区  ›  Tom

混淆Java泛型用法:如何正确地参数化?

  •  4
  • Tom  · 技术社区  · 14 年前

    我在看这张表格的代码:

    
         1  package com.stackoverflow.java.questions;
    
         2  import java.util.ArrayList;
         3  import java.util.List;
    
         4  public class B extends A<B> {
         5      
         6      private
         7      <C extends A>
         8      List<C> getList(Class<C> cls) {
         9          
        10          List<C> res = new ArrayList<C>();
    
                     // "snip"... some stuff happening in here, using cls
    
        11          return res;
        12      }
    
        13      public
        14      List<A> getList() {
        15          return getList(A.class);
        16      }
    
        17  }
    
        18  abstract class A<C extends A<C>> {
    
        19  }
    
    
    

    是的,我知道它很难看,但我尽量减少了。

    我的问题是如何正确地参数化第7、14和15行上a的使用?

    目前,我收到警告(A是原始类型。对于第7行和第14行,对泛型类型a的引用应该参数化)。我想,一旦我修好另外两个,我也会在15号线买一个,但我不确定。不管怎样,它目前还没有参数化,可能应该是参数化的,但是我不知道语法应该是什么。

    对于如何添加正确的参数语义和语法来消除这些警告有什么想法吗?

    注意:我不确定a是否是递归泛型是否重要。如果我只是使用“抽象类a{}”来代替它的当前定义,我仍然会收到同样的警告。

    老实说,如果这是我自己的代码,我会把它改得简单得多。不幸的是,它是api的一部分,所以我试图尽可能少地更改它。

    谢谢!

    更新:

    我可以像预期的那样通过参数化处理警告,但代价是出错。归根结底,如何从抽象类中获取类<a<b>>?

    有点像,

    类<A<B>>CLS=A.Class;

    但是,这会导致类型不匹配错误。

    更新,第2部分:

    原来,你就是不能这么做,因为类型删除。看我的另一个问题 here.

    3 回复  |  直到 14 年前
        1
  •  4
  •   C. K. Young    14 年前

    你可以先用 <C extends A<B>> List<A<B>> 在前两种情况下。在这种情况下,传递类型键会适得其反(参见 cls 参数从未使用过),所以,只需去掉它。

    (你总是可以说 B.<Foo>getList() 以特定的类型具体地实例化它,当然,假设您很高兴该类型没有具体化。)


    更新以合并OP的编辑:将使用 A<?> 为你的代码工作?在有限的情况下,您可能不需要完全指定类型。不幸的是,我没有你的代码,所以只有你才能知道它是否能工作。

        2
  •  0
  •   Santi P.    14 年前

    你到底是怎么处理CLS的?

    // "snip"... some stuff happening in here, using cls
    

    根据您在这里所做的操作,您可以用类型实例替换类实例,如果您再告诉我一些关于您在这里所做的操作,我可能会为您提供一个替代的解决方案来使其工作。

        3
  •  0
  •   Community dbr    7 年前

    原来,你就是不能这么做,因为类型删除。请看我的另一个问题: Java: how do I get a class literal from a generic type?