当对象类型包括基元和自定义类?</object>时,避免使用ArrayList <object>

时间:2014-04-16 05:58:50

标签: java

我有两个课程,我们称之为Foo和Bar。

public class Foo {
  //...
}

public class Bar {
  //...
}

我想创建一个可以处理Foo,Bar和String类型的ArrayList。通常,我只是在我的类中应用一个接口,即

public class Foo implements MyInterface {
  //...
}

public class Bar implements MyInterface {
  //...
}

然后我可以使用ArrayList<MyInterface>。但是,我正在努力解决如何为String实现此接口。我是否坚持使用ArrayList<Object>或是否还有另一种更优先的方式来完成此任务?

编辑:为我遇到的实际问题添加一些清晰度:

我想创建一个嵌入了对象的句子。

即。 “[Foo]跑上树,和[Bar]一起战斗,而一群[Foo]看着。”

因此,ArrayList可以通过其内容构造和解构,这些内容将按以下顺序编制索引:

  1. “The”
  2. [Foo] Object
  3. “跑上树,与”
  4. 战斗
  5. [Bar] object
  6. 我想到的另一种方法是按字符串中的索引和长度跟踪对象位置。所以我有一个整个句子的字符串,以及跟踪任何MyInterface对象的位置/长度的另一个属性。

4 个答案:

答案 0 :(得分:3)

如果您要拥有一个可以容纳String实例,Foo实例和Bar实例的集合,那么 - 是 - 没有其他可能性a Collection<Object>,因为这三种类型没有任何共同之处。

原因是,你确实有一个非常异质的集合。将其声明为Collection<Object>表示您拥有的和您想要的内容。

请注意,您认为正确的方向:您的集合的类型参数应该是它们最接近的类型。因此,如果您的课程FooBar实施了界面MyInterface,并且您计划只保留这两种类型的实例,那么您可以拥有Collection<MyInterface>

您不能让String类型实现您的界面。

答案 1 :(得分:3)

一个简单的解决方案是为String创建一个实现MyInterface的包装器。像:

public class MyString implements MyInterface {
  private String string;
....
}

然后将MyString的实例添加到列表中。

答案 2 :(得分:1)

如果您想将String与自定义对象存储在同一个A rrayList中,则表示您的类与字符串一起工作也没有?在您的课程中实施CharSequence

您不需要的CharSequence方法抛出MethodNotImplementedException

答案 3 :(得分:-1)

好吧,我认为你没有明确地理解Generic Type of Java的目的.Generic类型是显式定义元素类型,它意味着,只有当你的集合只包含一些类型元素时,Generic类型才能帮助你避免ClassCastException 。现在,你的收藏中绝对有三种类型。所以它不适合使用Generic Type。你可以简单地使用No Generic类型,比如

@SuppressWarnings("rawtypes")
ArrayList arrayList=new ArrayList();