如何使用通用方法查找对象的字段?

How to find a field of an object using a Generic method?

我有一个带有 public 'x' 字段的 Cube 对象。我的多维数据集 class 中有一个 toString 方法,它打印出 x、y、z 字段,但是当我直接访问它时,出现错误,其中:field cannot be resolved or is not a字段.

public <T> void setPosition(T object){
   System.out.println(object);  
   System.out.println(object.x); // error here
}

你的方法不知道什么是类型T

但是我们可以说 T 是一些 class 扩展

public class GenericCube {
    public String value;
    }

所以,现在我们能够访问 value 因为我们知道它

public <T extends GenericCube> void setPosition(T obj){
    System.out.println(obj);
    System.out.println(obj.value);
}

我建议定义一个接口来声明您的多个不同类型将公开的方法。类似于:

public interface ValueProducer {
  public String getValue();
}

然后,您的 Cube 类型将如下所示:

public <T extends ValueProducer> void setPosition (T obj) {
   System.out.println(obj);  
   System.out.println(obj.getValue());
}

那么您希望使用此方法的任何类型只需要实现接口 ValueProducer,并且仍然可以扩展或实现适合其用例的任何其他类型。

或者,您可以完全省略泛型,只需将 obj 作为 ValueProducer 传入。

我发现我可以使用反射方法访问该字段并转换为我需要的对象。使用带有此字段的抽象 class 支持这一点,以便从该对象继承的所有对象都可以使用此功能。

public <T> void setPosition(T object) {
   Field xField = object.getClass().getField("x");
   Field boxField = object.getClass().getField("boundBox");
   float xpos = (float)xField.get(object);
   BoundingBox box = (BoundingBox)boxField.get(object);
}

我愿意接受批评,但这对我从我的抽象基础 class 继承的多个 classes 非常有效。使用此方法的原因是另一个 class 可以与这些其他 classes 一起工作而无需创建多个函数,从而为想要创建自己的 classes 继承自的用户提供了灵活性摘要 class.