【问题标题】:Passing in a Type reference to a method将类型引用传递给方法
【发布时间】:2013-11-15 01:54:24
【问题描述】:

我想编写一个方法来创建我在方法参数中定义的类型的列表。因此,如果我有 3 个类:StudentTeacherJanitor,则该方法应创建传入的任何类型的 List

public void methodName(TYPE){  
    List<TYPE> results = new List<TYPE>();  
}

TYPE 应该使用什么?

【问题讨论】:

  • 你可能想看看 Java 泛型。

标签: java generics


【解决方案1】:

您可以使用 JAVA 泛型。一种方法是允许所有类类型都是可接受的,通过这个..

public <T> void methodName(Class<T> cl){  
    List<T> results = new ArrayList<T>();  
}

或者更好的方法是让所有你想被接受的类都派生自一个接口,比如Person,然后你就可以这样做了..

public <T extends Person> void methodName(Class<T> cl){  
    List<T> results = new ArrayList<T>();  
}

这将方法接受的类集限制为仅实现 Person 的类。

【讨论】:

    【解决方案2】:

    不完全清楚你想要什么,但一种选择如下:

    public <T>
    void methodName(Class<T> clazz) {
    
        List<T> results = new ArrayList<T>();
        ...
    }
    

    你可以这样称呼它:

    methodName(Student.class);
    

    【讨论】:

      【解决方案3】:

      如果这三个类可以从一个类继承或实现一个接口,那么你的方法签名可以是这样的:

      public List<ParentClass/Interface> methodName(TYPE);
      

      如果如上所述三个类不能与一个通用合同相关联,那么其他选择将是返回对象列表并在您迭代对象列表时适当地转换对象:

      public List<Object> methodName(TYPE);
      

      【讨论】:

        【解决方案4】:

        您可能想查看a question of mine,但是,它从另一方面解决了问题。

        基本上Java已经有这样的功能了(随意从那里开始):

        Collections.<String>emptyList()
        

        获取一个空列表,其中包含应该是字符串类型的元素。 Java 的源码如下所示:

        public static final List EMPTY_LIST = new EmptyList<Object>();
        :
        public static final <T> List<T> emptyList() {
          return (List<T>) EMPTY_LIST;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-03
          • 2011-01-01
          相关资源
          最近更新 更多