Наследование, дженерики и кастинг в Java - PullRequest
0 голосов
/ 16 апреля 2010

У меня есть два класса, которые оба extends Example.

public class ClassA extends Example {

    public ClassA() {
        super("a", "class");
    }
    ...
}

public class ClassB extends Example {

    public ClassB() {
        super("b", "class");
    }
    ...
}

public class Example () {

    public String get(String x, String y) {
        return "Hello";
    }
}

Так что все это очень хорошо. Итак, предположим, у нас есть другой класс с именем ExampleManager. В примере менеджера я хочу использовать универсальный тип и, следовательно, вернуть этот универсальный тип. например,

public class ExampleManager<T extends Example> {

    public T getExample() {
        return new T("example","example"); // So what exactly goes here?
    }
}

Итак, куда я возвращаю свой универсальный тип, как мне заставить его работать на самом деле правильно и приводить Example как classA или classB?

Большое спасибо

Ответы [ 3 ]

1 голос
/ 16 апреля 2010

Когда вы создаете конкретный экземпляр объекта (то есть вы используете new ), вы знаете фактический реализующий класс, вы не можете использовать универсальный тип.

Чего вы на самом деле пытаетесь достичь? Как вы решаете, хотите ли вы создать ClassA или ClassB?

Попробуйте это:

public class ExampleManager {
    public ClassA createClassA() {
        return new ClassA("example","example");
    }

    public ClassB createClassB() {
        return new ClassB("example","example");
    }
}

или это:

public class ExampleManager {
    public Example createExample() {
        if(a == b) {
           return new ClassB("example","example"); 
        }
        return new ClassB("example","example"); 
    }
}
1 голос
/ 16 апреля 2010

Вы не можете использовать универсальный тип для создания экземпляра нового объекта (т.е. вы не можете сделать new T(params)).

0 голосов
/ 16 апреля 2010

Как уже говорили другие, вы не можете использовать new для создания нового экземпляра неизвестного типа. Не используя рефлексию, вы можете сделать ExampleManager абстрактным суперклассом фабрик.

public abstract class ExampleManager<T extends Example> {
     public abstract T getExample(String x, String y);
}

public class ClassAManager extends ExampleManager<ClassA> {
     public ClassA getExample(String x, String y) {
          return new ClassA(x, y);
     }
}

public class ClassBManager extends ExampleManager<ClassB> {
     public ClassB getExample(String x, String y) {
          return new ClassB(x, y);
     }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...