java - 在方法中键入安全参数

标签 java android annotations type-safety

我正在使用一个提供自定义 View 的库。我想创建一个只接受来自该库的自定义 View 的方法。

例如我有一个 PieChart 和一个 TableChartTableChart 扩展了 LinearLayoutPieChart 扩展了一些内部 abstract 图表,后者扩展了 View。所以,我没有任何抽象类或接口(interface)可以描述这两个对象。

目前我的方法是这样的:

void draw(View chart, ChartData data) {
    switch (data.getType()) {
        case PIE_CHART:
            PieChart<Numeric> pieChart = (PieChart<Numeric>) chart;
            // ...
            break;
        case TABLE_CHART:
            TableChart tableChart = (TableChart) chart;
            // ...
            break;
        // ...
    }
}

所以,我实际上可以将任何 View 作为 chart 参数传递,这看起来不太好。我正在考虑在 android 中创建一些注释,例如 @IntDef 但用于类对象( https://developer.android.com/reference/android/support/annotation/IntDef.html )。我查看了源代码并尝试创建类似的东西,但没有成功。我仍然能够将任何 View 作为参数传递:

  @Retention(RetentionPolicy.SOURCE)
  @Target({ElementType.ANNOTATION_TYPE})
  @interface ClassDef {
    Class<? extends View>[] value() default {};
  }

  @Retention(RetentionPolicy.SOURCE)
  @ClassDef({PieChart.class, TableChart.class})
  @interface ChartView {}

  void draw(@ChartView View chart, ChartData data) // doesn't work

虽然我对 Java 注释不是很熟悉。有谁知道是否可以创建这样的注释,只允许将特定类作为参数传递? 也许还有其他方法可以实现类型安全?我无法更改库中类的源代码。

谢谢。

编辑

我提供了 PieChartTableChart 作为示例。在我的应用程序中,我有大约 10 种图表。

最佳答案

您可以定义两种公共(public)方法,一种接受 PieChart,另一种接受 TableChart。这将为您提供类型安全。如果存在共享逻辑,那么您可以从公共(public)方法中调用私有(private)或 protected 方法。注释方法行不通。

关于java - 在方法中键入安全参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31600903/

相关文章:

java - Spring 3 处理程序拦截器适配器。在调用拦截器之前请求以 404 结束

java - 如何在 JSON 响应中仅获取实体 ID 而不是整个实体

Android R 文件常量不自动更新

java - java持久化中注解映射是如何完成的?

c# - 动态注释/属性值

java - 如何在java中获取当前的maven配置文件ID

java - 生成的 JAR 主类抛出 ClassNotFoundException

java - 将 ExoPlayer 中播放的视频打开到外部播放器 Intent 中

android - 如何让LiveData在另外两个LiveData之间切换

grails - Grails JMS队列注释失败,带有最终参数