我正在使用一个提供自定义 View
的库。我想创建一个只接受来自该库的自定义 View
的方法。
例如我有一个 PieChart
和一个 TableChart
。 TableChart
扩展了 LinearLayout
但 PieChart
扩展了一些内部 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 注释不是很熟悉。有谁知道是否可以创建这样的注释,只允许将特定类作为参数传递? 也许还有其他方法可以实现类型安全?我无法更改库中类的源代码。
谢谢。
编辑
我提供了 PieChart
和 TableChart
作为示例。在我的应用程序中,我有大约 10 种图表。
最佳答案
您可以定义两种公共(public)方法,一种接受 PieChart,另一种接受 TableChart。这将为您提供类型安全。如果存在共享逻辑,那么您可以从公共(public)方法中调用私有(private)或 protected 方法。注释方法行不通。
关于java - 在方法中键入安全参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31600903/