【问题标题】:Java, passing an object to a different class [closed]Java,将对象传递给不同的类[关闭]
【发布时间】:2026-01-16 21:35:01
【问题描述】:

我是 Java 新手,正在尝试了解面向对象的编程。

我正在尝试将一个对象存储在一个数组中。但是,该数组位于与原始对象不同的类中。我得到一个编译器错误“不兼容的类型”需要(1 个类)找到(另一个类)。

请查看我的代码,让我知道我做错了什么。

这是来自“Cluster”类,该方法应该将“FeatureVector”类中的一个对象存储到一个名为“featureV”的数组中。

 public boolean add (FeatureVector examples){
    int currentPosition;

    if (this.getSize()==this.featureV.length){
      return false;
    }
    else 
      currentPosition=this.getSize();
    featureV[currentPosition+1]=examples;
    return true;

编辑:

这是 Cluster 和 featureV 的定义方式:

class Cluster{
  private Cluster [] featureV;


Cluster(int capacity){
  Cluster [] featureV= new Cluster [capacity];

错误:

错误:不兼容的类型 必需:集群 找到:特征向量

如果有帮助,这是我应该实现的要求和输出:

Cluster c;  
c = new Cluster(10);  
c.add(new FeatureVector("A", new double[] { 0.0, 0.0 }));  
c.add(new FeatureVector("B", new double[] { 1.0, 1.0 }));  
c.add(new FeatureVector("C", new double[] { 1.0, 0.0 }));  
c.add(new FeatureVector("D", new double[] { 2.0, 0.0 }));  
FeatureVector.setVerbose(true);  
System.out.println(c);

以上语句会在控制台显示如下:

Cluster: {A: {0.0, 0.0}, B: {1.0, 1.0}, C: {1.0, 0.0}, D: {2.0, 0.0}}

如果需要更多信息,请告诉我。

非常感谢!这个论坛是一个启示。 :)

【问题讨论】:

  • featureV 是如何声明的?
  • 请发布您得到的确切错误,并指出源代码中此错误所指的位置。还显示如何声明类型,例如featureV 是什么?
  • 考虑一下您的对象模型。 Cluster 对象包含一个 Cluster 对象数组没有多大意义。它是什么集群
  • 这里的想法是FeatureVector类包含大量的实例(数据的例子),Cluster类是保存来自FeatureVector集合的若干组(或集群)数据。说:我在 FeatureVector 中有 40 个对象,但我想把它分成 5 个对象。所以我将有 5 个集群实例存储来自 FeatureVector 的 8 个对象
  • 所以Cluster包含一个FeatureVector数组,FeatureVector包含...?

标签: java arrays class object methods


【解决方案1】:

在 add(FeatureVector examples) 中,您将 FeatureVector 类的对象存储在数组 featureV 中

public boolean add (FeatureVector examples){
  [...]
  featureV[currentPosition+1]=examples;
  [...]
}

为此,featureV 必须属于 FeatureVector[] 类或 FeatureVector[] 的超类。

但是在你的第二个 sn-p 中声明变量 featureV 时,你将它声明为 Cluster[]

class Cluster{
  private Cluster [] featureV;

除非 FeatureVector 扩展 Cluster(在这种情况下可能没有意义),否则 featureV 的类型不适合 FeatureVector。 您需要将 featureV 的类型更改为 FeatureVector[]

class Cluster{
  private FeatureVector [] featureV;

为了解释得更简单一点,让我们将类类型和变量名更改为其他内容:

class FruitBasket {
  private FruitBasket [] fruits;

  public boolean add (Fruit examples){
    fruits[currentPosition+1]=examples;
  }
}

所以现在我们有了一个 FruitBasket 类,其中 FruitBasket 类的每个 Object 都包含一个 FruitBasket 数组。所以我们有一定数量的插槽可以安装 FruitBaskets。 现在,在您的 add-method 中,您获取 Fruits 并尝试将它们挤入 FruitBasket-slots。 你能明白为什么这不起作用吗? 您只能将兼容的对象从一个对象投射到另一个对象。因此,虽然你可以在说水果时使用苹果或橙子,但当它说 FruitBaskets 时,你不能使用水果。

所以你要做的是:

class FruitBasket {
  private Fruit [] fruits;

  public boolean add (Fruit examples){
    fruits[currentPosition+1]=examples;
  }
}

这可能是您想要的。这个 FruitBasket 现在有一定数量的水果槽,现在您可以使用 add() 方法将另一个水果添加到篮子中。

【讨论】:

  • 非常感谢您的回复。这非常有帮助。我只是有一个问题。如果我在 Fruit 类下声明一个数组 fruits,为什么我需要 FruitBasket 类?类的想法是保护信息并使其对他们所在的人保密。如果按照您上面提供的示例,在数据保护方面,我的水果属于 FruitBasket 还是属于 Fruit?行“private Fruit[]水果;”在 FruitBasket 或 Fruit 中将其设为私有?再次感谢你。你非常乐于助人。
  • 数据保护不是类中最重要的部分。类更多地是将属于一起的东西打包在一起。对于您的示例:一个水果由多个水果组成是否有意义?如果是,请继续,如果不是,则将 Fruit-Array 打包到一个不同的类中,该类由/包含 Fruits。对于第二个问题:您必须区分对象和引用。对象是内存中数据的某种表示。引用是指向该对象的变量。参考水果只对 FruitBasket 可见,Object 对所有人可见
  • 因此,如果您将两个不同的对象引用到同一个水果,那么两者都将能够访问该水果。示例:水果 apple = new Fruit(); FruitBasket 篮子A = new FruitBasket(); FruitBasket basketB = new FruitBasket();篮子A.add(苹果);篮子B.add(苹果);现在苹果将在两个篮子的 Fruit[] fruits-Array 中。两个篮子都可以访问苹果。但是引用私有 Fruit[] fruits 将无法从其他类访问(从外部 FruitBasket.fruits[0] = apple; 将不起作用)
【解决方案2】:

试试

class Cluster{
  private FeatureVector [] featureV;


Cluster(int capacity){
  FeatureVector [] featureV= new FeatureVector [capacity];

您正在定义一个特定类型的对象数组(此处为集群),并且您希望在此数组中存储另一个对象;这不兼容。您必须定义要在其中存储对象的类的数组。

【讨论】:

  • 上面的例子可能有效,但新对象是在 FeatureVector 下定义的,而我需要它们在 Cluster 下。因为在我的原始代码中,我试图将 FeatureVector 的引用存储在 Cluster 中,所以它没有意义。但是,如果我有办法从 FeatureVector 正确复制对象的数据并在 Cluster 下创建一个全新的对象,它可能会起作用,但我不知道该怎么做,或者是否可能。
  • 上面的例子似乎是正确的。您的评论难以理解。
  • 考虑重组你的类,也许你应该熟悉对象的继承和反射。
  • 为什么要反思?这是一个简单的数据模型问题。我什至看不到这里有任何继承要求,除非 FeatureVector 继承自某个向量类,在这种情况下,它更可能只是 be 一个向量类,例如ArrayList.
  • 没有向量类,没有ArrayList。
最近更新 更多