Я довольно новичок в программировании на Java, и у меня есть вопрос дизайна. На данный момент я получил следующее:design issue generics/factory/abstract class
public class MyFactory {
private MyFactory(){
//hidden constructor
}
public static ImageFilter getInstance(String filterType){
if(filterType == “foo“){
return new FooFilter();
}
return null;
}
}
public abstract class ImageFilter {
public abstract Bitmap filterImage(byte[] data);
//some other stuff
}
public class FooFilter extends ImageFilter {
public C filterImage(byte[] data){
//want to apply filterImageA or filterImageB depending what I put in
//at (*) and (**)
}
private A filterImageA(byte[] data){
//
}
private B filterImageB(byte[] data){
//
}
}
void main(byte[] data) {
ImageFilter bar = MyFactory.getInstance(“foo“);
BitmapType1 myBitmap = bar.filterImage(byte[] data); //(*)
BitmapType2 myBitmap2 = bar.filterImage(byte[] data); //(**)
}
В основном методе я знаю, каков результирующий тип. Если это BitmapType1, я должен применить filterImageA. Если это BitmapType2, то я должен использовать filterImageB. Есть ли общий способ сделать это? Я читал о дженериках, но понятия не имею, как их использовать в этом конкретном случае. Надеюсь, это не слишком смущает. Возможно, весь подход - дерьмо. Не стесняйтесь предлагать лучший!
Я пробовал это по-своему, но у меня получилось сообщение об ошибке вроде: '' несовместимые условные типы операндов Class и Bitmap ". Единственным общим суперклассом, совместно использующим оба типа изображений, является Object. Может ли это быть проблема? Можно ли обойти это? –
Это ошибка компиляции? В какой строке возникает ошибка? Если вы используете Eclipse, см. [Этот вопрос] (http://stackoverflow.com/questions/2551337/instanceof-incompatible-conditional-operand-types), особенно второй ответ. Это может быть полезно. –
Да, это ошибка времени компиляции. Я использую Eclipse, но Bitmap импортируется. Просто для удовольствия я попробовал что-то вроде 'T test = null' и' if (clazz instanceof test) ... ', и ошибка исчезла. К сожалению, это условие не изменилось. Я не знаю, действительно ли я понимаю концепцию класса Class clazz'. Действительно ли это экземпляр T? –