2016-05-12 2 views
0

1) У меня есть класс с именем Utilites, который выполняет некоторые строковые проверки, чтобы убедиться, что «ID» соответствует стандарту.Передача getClass() в качестве параметра для другого класса

2) Я хотел передать детали вызывающего класса классу Utilities, чтобы решить, является ли «ID» правильным для этого типа (между Members и Holding).

3) PremiumMember представляет собой расширенный класс Member и передает все параметры Member

4) На данный момент, создавая новый PremiumMember имеет класс java.lang.Class вместо ожидаемого library.Member

класс, содержащий Основной способ, чтобы проверить код

package library; 
import lib.Utilities; 
public class LibraryManagementSystem 
{ 
    static Member[] members = new Member[15]; 

    public static void main(String[] args) 
    { 
     members[0] = new PremiumMember("p000001", "Mr Bill Wrong"); // Prints **Java.lang.Class** 
     System.out.println(members[0].getClass());     // Prints **library.Member** 
    } 

класс, содержащий конструктор

import lib.Utilities; 
public abstract class Member { 

public Member(String memberID, String fullName)  // Constructor for each member 
{ 
    memberNumber = Utilities.validateId(memberID, this.getClass()); // Makes sure that the ID conforms to all requirements 
    this.fullName = fullName; 
} 

утилит, класс, который проверяет действительность идентификационного номера

import library.Holding; 
import library.Member; 
public class Utilities { 

public static String validateId(String checkId, Type classType) 
{ 
    if (classType.getClass().getGenericSuperclass() == Holding.class) 
    { 
     // Deal with code one way 
     return "Is of Holding Class" 
    } 
    else if (classType.getClass().getGenericSuperclass() == Member.class) 
    { 
     // Deal with code another way 
     return "Is of Member Class" 
    } 
    else 
    { 
     System.out.println(classType.getClass() + " Not of Member/Holding class"); 
     return "INVALID"; 
    } 

Я не понимаю, почему инстанцировании и якобы собирается, хотя пользовательский конструктор возвращает Java.lang.Class класс?

Спасибо!

ответ

4

Вы звоните getClass() на java.lang.reflect.Type - так, что только собирается дать вам Class.class ... По сути, вы назвали this.getClass().getClass(), и вы не хотите, чтобы сделать это.

Я подозреваю, что вы хотите изменить метод validateId принять Class<?> вместо Type, а затем просто использовать classType.getGenericSuperclass() и т.д. (я не проверил вашу логику над тем, как вы с помощью класса - давайте фокус на получение нужного класса для начала.)

+0

Не могли бы вы объяснить часть 'Вы вызываете getClass() на java.lang.reflect.Type' – Abhishek

+2

@Abhishek: Посмотрите на код в' validateId' - тип параметра 'classType' -' Type', а тело метода использует 'classType.getClass()' ... –

+0

Это был ясный и сжатый ответ, спасибо. Я изменил параметр, посланный в 'Utilities.ValidateId', на' this.getClass() ', и я изменил параметр, принятый в класс classType'. 'Sysout' в методе' ValidateId' успешно показывает 'library.Member'! – Ari

Смежные вопросы