Generic-класс, наследуемый от Exception

Рейтинг: 0Ответов: 1Опубликовано: 07.01.2015

Для передачи какого-либо объекта через исключения, я написал Generic-класс, наследуемый от Exception, но компилятор говорит, что generic-класс не может быть унаследован от java.lang.Throwable. Вот код класса:

public class ObjectException<O extends Object>extends Exception {
    private O object;
    public ObjectException(O object)throws NullPointerException{
        if(object!=null)this.object=object; else throw new NullPointerException();
    }
    public O getObject(){
        return this.object;
    }
    static public <O extends Object> void throwObject(O object)throws ObjectException{
        throw new ObjectException<O>(object);
    }
    public void throwObject()throws ObjectException<O>{
        throw this;
    }
    static public <O extends Object> ObjectException<O> getException(O object){
        return new ObjectException<O>(object);
    }
    public ObjectException<O> getException(){
        return this;
    }

    @Override
    public String toString()
    {
        return "ObjectException with object:"+this.object.toString();
    }

}

Можно ли как-нибудь обойти это ограничение или реализовать эту идею как-нибудь по-другому?

Ответы

▲ 3

С формальной точки зрения, нельзя, так как запрещено спецификацией языка, точка.

С неформальной точки зрения, мотивация следующая. Вспомните, что дженерики в Java — конструкция времени компиляции, не существующая во время выполнения. Это значит, что в рантайме нет никакой разницы между ObjectException<String> и ObjectException<Integer>. И catch тоже не сможет их различить.

Поэтому код

try {
   ObjectException<Integer>.throwObject(42);
} catch (ObjectException<String> ex) {
   String s = ex.GetObject();
}

вылетит из-за неправильного преобразования типов, при попытке привести Integer к String!