Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > уточнить тип


Автор: Fieral 11.6.2009, 17:39
есть 

Код

public class MyC<E>{


 void do(){

     if(E extends A){
           do1();
      }else{
           do2();
      }


 }

}


что нудно написать вместо extends чтобы было правильно?

Автор: Старовъръ 11.6.2009, 18:56
instanceof. Но это сработает только для объектов. Тебе, наверное, нужно E.class.equals(A.class);

Автор: math64 11.6.2009, 19:25
На этапе выплнения информация о типе будет стёрта и E = Object. Но если в кострукторе объекта передать объект типа E и запомнить его в переменной E e, то можно так:
Код

public class MyC<E>{
  private E e;
  public MyC(E e) { this.e = e; }
  public doSomething() {
     if (e instanceof A) {
        doSomethingWithA();
     }
  }
}

Автор: MisterCleric 12.6.2009, 09:24
можно еще так
Код

public class MyClass<T> {
    private Class<T> myClassType;

    public MyClass() {
        this.myClassType = (Class<T>)
                ((ParameterizedType) getClass().getGenericSuperclass())
                        .getActualTypeArguments()[0];
    }

    public T f() {
        if (myClassType.equals(MyClass2.class)) {
            ....
        } else {

         }

    }
}


Автор: ivg 12.6.2009, 10:12
Цитата(MisterCleric @  12.6.2009,  11:24 Найти цитируемый пост)
можно еще так

Нельзя
Код

    public static void main(String[] args) {
        new MyClass<String>().f();
    }

Автор: MisterCleric 12.6.2009, 10:36
Цитата

Нельзя

А, сорри, виноват. Должно быть так
 
Код

public abstract class A<T> {
    private Class<T> myClassType;

    public A() {
        this.myClassType = (Class<T>)
                ((ParameterizedType) getClass().getGenericSuperclass())
                        .getActualTypeArguments()[0];
    }

    public void f() {
        if (myClassType.equals(String.class)) {
            System.out.println("I'm String");
        } else {
           System.out.println("Other type");
        }
    }
}

Код

public class B extends A<String>{
}

Код

 public static void main(String[] args) {
       new B().f();
    }


Ну, наверное, это не по теме будет...
Хотя действительно, зачем делать проверку на подобие
Цитата

 if(E extends A){
           do1();
      }else{
           do2();
      }


Если лучше понаписывать наследников конкретного типа и реализовать их специфическую логику в методе 
Цитата

void do(){...}

Это исходит из рефакторинга предложенного Мартином Фаулером: замена условных выражений иерархией. 

Автор: ivg 12.6.2009, 11:14
Цитата(MisterCleric @  12.6.2009,  12:36 Найти цитируемый пост)
А, сорри, виноват. Должно быть так

Код

public class B<T> extends A<T>{
}

Код

    public static void main(String[] args) {
        new B<String>().f();
    }

Автор: kBepTu 13.6.2009, 13:28
промахнулся  smile 
P.S. просьба удалить пост

Автор: Fieral 15.6.2009, 11:52
короч надо переделать всё

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)