Я использую библиотеку, которая предоставляет пользовательские View
s. Я хочу создать метод, который принимает только пользовательские View
s из этой библиотеки.Тип безопасного параметра в методе
E.g. У меня есть PieChart
и TableChart
. TableChart
extends LinearLayout
, но PieChart
расширяет часть внутренней диаграммы abstract
, которая распространяется на View
. Итак, у меня нет абстрактного класса или интерфейса, которые могут описывать оба этих объекта.
В настоящее время мой метод выглядит следующим образом:
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
, который не выглядит хорошо. Я думал создать некоторую аннотацию, такую как @IntDef
в android, но для объектов класса (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
Я не очень знаком с ява аннотаций, хотя. Кто-нибудь знает, возможно ли создать такую аннотацию, которая позволит передавать только определенные классы в качестве параметра? Возможно, существует какой-то другой подход к обеспечению безопасности типа? Я не могу изменить исходный код классов внутри библиотеки.
Спасибо.
РЕДАКТИРОВАТЬ
я предоставил PieChart
и TableChart
в качестве примеров. В моем приложении у меня около 10 типов диаграмм.
хорошо, спасибо. Ваш подход хорош, если у меня есть только эти две диаграммы, но, к сожалению, у меня около 10 типов, которые дадут мне 10 методов. Любые другие идеи? –