2012-02-03 2 views
0

основной отливка должна бытьCast класс в Java

MyClass тс = (MyClass) aClass

, который легко

но на основе моей программы, я не знаю, имя класса до выполнения.

например, имя класса может быть interp_0, interp_1, interp_2, interp_3 ....... #;

Есть ли в java, что я мог бы использовать для его броска?

На данный момент у меня есть только

Класс afterCast = Class.forName ("Interp_" + countState);

но то, что я хочу

("Interp_" + countState) afterCast

, не

Класс afterCast

.

Спасибо за всех, кто мне помогает. Это так быстро, как я ожидал.

+3

И какой тип переменная, которую вы вставляете? Вы не можете объявить этот тип (как вы его не знаете), поэтому я не вижу смысла в том, что вы хотите сделать. Вероятно, лучший способ - определить общий тип подкласса для всех ваших типов Interp_ * и включить в него. – okrumnow

ответ

0

Я бы предложил использовать интерфейс, реализованный всеми этими классами, который содержит нужные вам методы. Затем вы можете использовать этот интерфейс. Я не понимаю, почему это должно быть сделано иначе, потому что вы знаете, какие методы вы ожидаете на тех объектах, которые на самом деле являются интерфейсом.

+0

Это хорошие мысли, я так не думаю. Но это не работа в моем актерском составе. метод интерфейса не может быть статическим. Мой метод был – RobinBattle

+0

@ user1187029 Это правда, но вы должны учитывать, что методы не должны быть статическими, потому что очень сложно иметь дело с обычными статическими методами разных типов в едином виде. Однако, если вам нужно решение, как оно есть, вы можете использовать отражение. 'Класс myClass.getMethod (" methodName ", argTypes)', см. Http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html –

+0

Спасибо за помощь. Может быть, так, как я с этим справляюсь, это неправильно. Я пытаюсь построить глупый переводчик. Я попытаюсь использовать javacompiler для компиляции файла. – RobinBattle

0

Что вы ищете, вероятно, что-то вроде этого:

Class newClass = Class.forName("Interp_" + countState); 
newClass.cast(yourObject); 

Однако, не зная фактического класса во время компиляции, там похоже, не будет иметь ничего общего с тем, что вы действительно можете использовать с соответствующим образом литым значением, так как вы не сможете выразить какие-либо конкретные вызовы методов или ссылки на поля в своей программе без определенного класса. Вы уверены, что вас не смущают что-то еще? Что вы действительно пытаетесь достичь?

+0

Ваше решение не работает, тип результата второго оператора по-прежнему является объектом, и я не вижу способа, как это можно было бы сделать так. –

+0

Точно. Вот что я написал в следующем абзаце. Тем не менее, он действительно дает «ClassCastException», если он не соответствует данному типу.:) – Dolda2000

+0

Это правда, но даже если бы это сработало, вы все еще не можете использовать методы этого объекта в своем коде, потому что для этого динамического типа, который является оригиналом, нужно будет отбросить возвращаемое значение оператора cast проблема снова. –