2015-11-24 5 views
3

У меня есть метод, который принимает в качестве параметра все классы, которые расширяют Persona.Class (Uomo.Class и Donna.Class). Persona.Class).Ошибка при «экземпляреOf» при проверке subClass

public PersonaDecorator(Class <? extends Persona> persona) {    
    }  

Внутри этого метода, мне нужно знать, если класс отправляется метода Uomo.Class или Donna.Class.

Я думал, что я мог сделать что-то вроде этого:

public PersonaDecorator(Class <? extends Persona> persona) {  
    if(persona instanceof Uomo){ 
     ...... 
    }  
} 

Но я получаю эту ошибку: Incompatible conditional operand types Class<capture#1-of ? extends Persona> and Uomo

Спасибо вам

+1

Не было бы 'PersonaDecorator (Персона Персона)' также вариант? – SubOptimal

+0

О да, вы правы. Тогда у меня возникает вопрос: когда выбираете PersonaDecorator (Persona persona) над PersonaDecorator (Class persona) и наоборот? – MDP

ответ

5

The instanceof тестов операторских ли относится ссылка (левый операнд) к объекту, который является экземпляром класса, названного в правом операнде.

Здесь persona будет ссылка на экземпляр Class и экземпляр Class никогда не может быть экземпляром Persona. Вы тестируете невозможное условие, и компилятор помогает вам сообщить об этой ошибке.

Я подозреваю, что вы хотите Class.isAssignableFrom:

if (Uomo.class.isAssignableFrom(persona)) 

Что бы найти подклассы Uomo, а также. Если вы хотите проверить, является ли это именноUomo класс, вы можете просто использовать:

if (persona == Uomo.class) 
+0

Спасибо, isAssignableFrom - это то, что мне нужно :) – MDP

+1

@MatteoDepasquali Там может быть риск. В случае, если 'persona' будет подклассом' Uomo', тогда 'Uomo.class.isAssignableFrom (persona)' также будет истинным. – SubOptimal

+0

Persona не может быть подклассом Uomo. Только Uomo может быть подклассом Persona – MDP