Generics и instanceof - Java - PullRequest
       294

Generics и instanceof - Java

4 голосов
/ 09 декабря 2010

ОК, это мой класс, он инкапсулирует объект и передает этому объекту equals и String, почему я не могу использовать экземпляр ???

public class Leaf<L>
{
    private L object;

    /**
     * @return the object
     */
    public L getObject() {
        return object;
    }

    /**
     * @param object the object to set
     */
    public void setObject(L object) {
        this.object = object;
    }

    public boolean equals(Object other)
    {
        if(other instanceof Leaf<L>) //--->ERROR ON THIS LINE
        {
            Leaf<L> o = (Leaf<L>) other;
            return this.getObject().equals(o.getObject());
        }
        return false;
    }

    public String toString()
    {
        return object.toString();
    }
}

как мне заставить это работать ?? Спасибо!

Ответы [ 3 ]

10 голосов
/ 09 декабря 2010

Из-за типа стирания вы можете использовать instanceof только с типами reifiable .(Интуитивно понятное объяснение состоит в том, что instanceof - это то, что оценивается во время выполнения, но параметры типа удаляются («стираются») во время компиляции.)

Вот хорошая запись в FAQ по общим вопросам:

2 голосов
/ 26 мая 2013

У меня похожая проблема, и я решил ее с помощью отражения следующим образом:

public class Leaf<L>
{
    private L object;

    /**
     * @return the object
     */
    public L getObject() {
        return object;
    }

    /**
     * @param object the object to set
     */
    public void setObject(L object) {
        this.object = object;
    }

    public boolean equals(Object other)
    {
        if(other instanceof Leaf) //--->Any type of leaf
        {
            Leaf o = (Leaf) other;
            L t1 = this.getObject();   // Assume it not null 
            Object t2 = o.getObject(); // We still not sure about the type
            return t1.getClass().isInstance(t2) && 
               t1.equals((Leaf<L>)t2); // We get here only if t2 is same type
        }
        return false;
    }

    public String toString()
    {
        return object.toString();
    }
}
2 голосов
/ 09 декабря 2010

Общая информация фактически удаляется во время компиляции и не существует во время выполнения. Это известно как стирание типа. Под капотом все ваши объекты Leaf фактически становятся эквивалентными Leaf , и при необходимости добавляются дополнительные приведения.

Из-за этого среда выполнения не может определить разницу между Leaf и Leaf и, следовательно, экземпляр теста невозможен.

...