Скажем, у меня есть абстрактный базовый класс, который имеет способ генерации объектов Foo
(действует как заводский метод). Сейчас мои классы выглядят примерно так:Фабрично-подобный метод как метод абстрактного шаблона
public class Foo
{
}
public class FooBar extends Foo
{
}
public abstract class MyBaseClass
{
abstract public Foo createObject();
}
public class MyDerivedClass extends MyBaseClass
{
@Override
public Foo createObject()
{
return new FooBar();
}
}
Это неоптимальной, так как код, вызывающий MyBaseClass#createObject
потребности бросить возвращаемое значение обратно к тому, что он был изначально, а именно:
FooBar fooBar = (FooBar)myDerivedClass.createObject();
Это как снять штаны, чтобы снова надеть их.
Я не использовал Java дженериков на некоторое время, но я надеялся, что я мог бы превратить этот абстрактный метод в шаблонный метод, что-то вроде:
public abstract class MyBaseClass
{
abstract public <T extends Foo> T createObject();
}
Но я получаю следующие ошибки из Eclipse, когда я попытаться реализовать метод в производном классе:
public class MyDerivedClass extends MyBaseClass
{
@Override
public <FooBar extends Foo> FooBar createObject() // The type parameter FooBar is hiding the type FooBar
{
return new FooBar(); // Cannot instantiate the type FooBar
}
}
Я не думаю, что я применяю правильное решение моей проблемы сокращения ненужного литья происходит. Есть идеи?
Это с Java 1.6.
Возможно, вам нужно понять эффекты стирания на Java-дженериках. http://docs.oracle.com/javase/tutorial/java/generics/erasure.html – esej
related: http://stackoverflow.com/q/10127502/697449 –