2010-04-15 2 views
0

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

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?

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

+0

дублируют http://stackoverflow.com/questions/75175/create-instance-of-generic-type-in-java – unholysampler

+1

Вы ищете * реифицированные Дженерики *. Это не поддерживается в Java. C# поддерживает его. В Java generics являются только compiletime. Посмотрите заводскую модель, см. Ссылку выше, чтобы дублировать вопрос для правильных ответов. – BalusC

+0

@BalusC: Вы видите, как применять заводскую схему здесь? Я просто не понимаю, как реализовать метод 'E create()' на Factory (от Tom Hawtin - ответ на тайтл http://stackoverflow.com/questions/75175/create-instance-of-generic-type-in-java/75528 # 75528) – Roman

ответ

1

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

1

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

Что вы на самом деле пытаетесь достичь? Как вы решаете, хотите ли вы создавать 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"); 
    } 
} 
0

Как уже сказал, вы не можете использовать новое, чтобы создать новый экземпляр неизвестного типа. Без использования отражения вы могли бы сделать 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); 
    } 
} 
Смежные вопросы