【问题标题】:List of generic class泛型类列表
【发布时间】:2015-04-23 18:43:54
【问题描述】:

我有 Example1Example2 课程。我在每个类中只添加了一个字段:

public class Example1 {
   private String test1;
   //setter and getter
}

public class Example2 {
   private String test2;
   //setter and getter
}

现在我需要将一个列表从这两个类之一传递给一个方法。事实上,我想要一个可以接受这两个类的列表作为参数的方法。我知道泛型类,但我不知道在这种情况下如何使用泛型类。谁能帮我? 提前致谢。

更新: 例如假设我有两种这样的方法:

public void workingMethod1(List<Example1> list){
}
public void workingMethod2(List<Example2> list){
}

其实我是想把这两种方法结合起来,有一种方法。

【问题讨论】:

  • 您需要两个类都继承自同一个class。或者使用List&lt;? extends Object&gt;,在这种情况下List 中的项目将被视为Object
  • 为什么List&lt;? extends Object&gt; 会更好?从事物的声音来看,这两个类是相关的(您可以在函数中使用一个而不是另一个),因此它们可能共享一些功能 - 为什么不在类层次结构中表示呢?
  • 或者,您可以重载方法...
  • @will,如果这些类确实相关,那么继承可能是更好的选择,甚至是具有重载方法的单个类,但是 OP 已经开始讨论泛型,因此我们失败了关于泛型的讨论。
  • @BoristheSpider Or use a List&lt;? extends Object&gt; ... 对,谁关心类型安全。

标签: java list generics arraylist


【解决方案1】:

我根据上面的蜘蛛 Boris 的建议创建了一个非常基本的代码示例。它只是骨架代码,没有任何功能。它只是展示了方法和两个类中泛型的思想。

package test;

import java.util.ArrayList;
import java.util.List;


public class Test {
    public class Example1 {
    }

    public class Example2 {
    }

    public static void workingMethod1(List<? extends Object> list){

    }
    public static void workingMethod2(List<? extends Object> list){

    }
    public static void main(String[] args) 
    {   
        Test t = new Test();
        Example1 eg1 = t.new Example1();
        Example2 eg2 = t.new Example2();
        List<Example1> list1 = new ArrayList<Example1>();
        List<Example1> list2 = new ArrayList<Example1>();

        workingMethod1(list1);
        workingMethod2(list2);
    }
}

【讨论】:

  • 好主意。而且由于这两种方法都接受List&lt;File&gt;List&lt;String&gt;List&lt;Date&gt;,...你不必关心类型安全。
  • 如果 OP 知识渊博,可以在代码中处理类型安全,这只是骨架代码。仅仅因为您可以将任何对象发送到方法中并不意味着该方法必须接受它或导致任何实际问题。
  • 我在@tom 这边,我不知道它有什么推荐的标准,imo 最好有函数签名描述(至少 somehwat)函数如何应该使用它,而不是尝试它并查看以后会出现什么错误。
  • @will 像entry instanceof DesiredType这样检查每个条目可以避免异常,但是使用泛型的目的是避免这样的检查。是的,包含泛型的签名更加详细和有用。
  • @Tom 我真的没有跟上 java 的变化(从 1.6 开始),但是如何检查它是否是一个实例来防止异常呢?当然,您要么检查函数内部的类型,如果它是错误的类型(你会在外面捕获)则抛出,或者你只是在调用之前检查类型并将程序流发送到同一个地方。
【解决方案2】:

免责声明:

  1. 我一直在喝酒,所以这里可能有很多错别字。
  2. 我最近没有做太多java,我现在的机器上没有它
  3. 我没有及时了解自 1.6 以来的变化,因此可能会错过一些现代技术。

有两种方法我会考虑这样做。一种是拥有您正在查看的两个类的公共类,另一种是重载您希望能够处理两个可能列表的方法。

我也不明白为什么这里需要泛型。

方法一:

public class BaseClass{
   // whatever
}

public class Example1 extends BaseClass{
   // whatever
}

public class Example2 extends BaseClass {
   // whatever
}


public void workingMethod(List<BaseClass> list){
   // whatever
}

或者,如果两个类没有太多共同点,另一种方法是重载workingMethod 方法:

public class Example1{
   // whatever
}

public class Example2{
   // whatever
}

public void workingMethod(List<Example1> list){
  // do whatever to create the list needed to call the function you want
  List<Double> someCrap = new List<Double>();
  for(Example1 e1 : list){
    someCrap.add(e1.getRandomCrap());
  }
  commonWorkingMethod(someCrap );
}

public void workingMethod(List<Example2> list){
  // do whatever to create the list needed to call the function you want
  List<Double> etc = new List<Double>();
  // do more crap
  commonWorkingMethod(etc);
}

public void commonWorkingMethod(List<Double> list){
   // whatever
}

【讨论】:

  • 您的第二种方法不会编译,因为两个workingMethod 实现具有相同的擦除。顺便说一句:I also don't understand why generics are needed here. 好吧,你还在使用它们,所以不知何故需要它们:P。
  • 嗯。我不知道这个。而且我认为泛型专门使用&lt;? extends BaseClass&gt; 之类的东西,而不仅仅是使用类层次结构。
  • 这只是一种泛型(? 是通配符)。所以&lt;&gt; 之间的所有内容都是“通用的”:D。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-04
  • 1970-01-01
  • 2010-12-02
相关资源
最近更新 更多