【问题标题】:Accessing Field Variable from Generic Object从通用对象访问字段变量
【发布时间】:2013-10-21 12:41:22
【问题描述】:

我有两个类,ClassOneClassTwo,它们更新公共字段 data,即,

public class ClassOne {
    public byte[] data = new byte[10];

    // Thread that updates data

}

public class ClassTwo {
    public byte[] data = new byte[10];

    // Thread that updates data

}

在任何给定时间只有一个类及其关联线程在运行,即应用程序在运行时检测数据源并使用ClassOneClassTwo。我想在一个名为ParseMyData 的单独类中解析数据,但对于设置它的最佳方法有点困惑,因此ParseMyData 可以从ClassOneClassTwo 访问data

我目前正在尝试使用泛型来做到这一点,例如:

public class ParseMyData<T> {

    T classOneOrClassTwo;

    ParseMyData(T t) {
        classOneOrClassTwo = t;
    }

    public void parseIt() {
        // Need to access data from either ClassOne or ClassTwo here, something like:
        classOneOrClassTwo.data; // this obviously doesn't work
    }

所以我的问题是如何从 ParseMyData 类中访问字段 data?我必须使用反射吗?反射是唯一且最好的方法吗?

对泛型和反射不熟悉,因此非常感谢您的想法和建议。

【问题讨论】:

  • ClassOneClassTwo 都可以实现提供访问方法的接口。这在线程程序中可能不是一个好主意。

标签: java android generics reflection


【解决方案1】:

使用方法getData() 创建一个接口DataProvider,该方法返回您的data 字段。 然后在你的课堂上ParseMyData&lt;T&gt; 你将改为写ParseMyData&lt;T extends DataProvider&gt;

public class ParseMyData<T extends DataProvider> {

    T classOneOrClassTwo;

    ParseMyData(T t) {
        classOneOrClassTwo = t;
    }

    public void parseIt() {
        classOneOrClassTwo.getData();
    }

或者,您也可以使用您的版本,但先检查instanceof,然后转换为ClassOneClassTwo。但我建议您使用第一个选项。

【讨论】:

  • 太棒了。今天早上第一次去泛型,并没有意识到你可以用一个接口来扩展它。正如你所写的那样有道理 - 完成后我会对其进行测试并投票/标记等。谢谢。
猜你喜欢
  • 2018-11-14
  • 2019-01-26
  • 2022-07-28
  • 2011-01-01
  • 1970-01-01
  • 2012-03-30
  • 2013-04-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多