2014-06-12 3 views
0

у меня есть этот общий класс:Instantiate общий класс, используя класс выполнения объекта

public class MyClass<T> { 

    public void myMethod(T arg) { 
     // ... 
    } 
} 

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

То есть, если у меня есть:

SomeClass o = new SomeClass() 

Как я могу получить экземпляр MyClass<SomeClass>, получив класс во время выполнения o?

В основном то, что мне нужно что-то вроде этого (я знаю, что это не имеет смысла ... это просто, чтобы дать представление):

MyClass<o.getClass()> m = new MyClass<o.getClass()>() 

возможно ли это? Если нет, могу ли я достичь своей цели иметь экземпляр MyClass, у которого есть метод, который принимает аргумент того же типа типа времени выполнения o? (да, это должен быть точный тип, не может быть суперклассом)

Отражение - это вариант здесь!

Спасибо!

+0

Дженерики вообще не существуют во время выполнения. – SLaks

+0

@Adam Arold, как у них такой же вопрос? – jamp

+0

Это не так. Вы не хотите определять общий тип данного общего объекта, который вы хотите создать, используя определенный тип времени выполнения. Интересный вопрос. – Ray

ответ

1

Из-за стирания типа времени выполнения объект времени выполнения, созданный MyClass<X> и MyClass<Y>, будет идентичным. Тот факт, что new MyClass<X>().myMethod() можно вызывать на X, но не на Y, является фактом компиляции, а не временем выполнения. Вопрос времени компиляции - «можно ли это назвать по этой переменной«, а не «можно ли его называть на объектах с тем же результатом getClass()».

Вы можете создать фабричные методы для создания родовых экземпляров вашего класса на основе типов во время компиляции Class объектов, или фактических объектов, которые вы хотите использовать его:

public class MyClass<T> { 
    // ... 

    public static <T> MyClass<T> forClass(Class<T> c) { 
     return new MyClass<T>(); 
    } 

    public static <T> MyClass<T> forObject(T object) { 
     return new MyClass<T>(); 
    } 
} 

Если вы хотите, чтобы ваш метод общего класса, чтобы на самом деле иметь время выполнения тип проверка, возможно, тоже. Просто сохраните объект Class для типа вашего экземпляра MyClass и используйте его метод isInstance() или cast(), чтобы проверить тип аргумента для вашего метода. Вы должны сделать это вручную, потому что это не то, что обычно делается для обычных общих классов, а это потому, что это обычно не нужно.

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