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

时间:2018-08-07 19:12:04

标签: java generics field

我有一个带有公共“ x”字段的Cube对象。我的Cube类中有一个toString方法,该方法打印出x,y,z字段,但是当我直接访问它时,出现以下错误:字段无法解析或不是字段

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

3 个答案:

答案 0 :(得分:3)

我建议定义一个接口,该接口声明您的多种不同类型将公开的方法。像这样:

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传入。

答案 1 :(得分:1)

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

但是我们可以说T是扩展的某个类

public class GenericCube {
    public String value;
    }

因此,现在我们可以访问value,因为我们知道它

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

答案 2 :(得分:-1)

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

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);
}

我乐于接受批评,但这在从我的抽象基类继承的多个类上一直很好。之所以使用这种方法,是因为另一个类可以在不创建多个函数的情况下与这些其他类一起工作,从而为想要创建自己的从抽象类继承的类的用户提供了灵活性。