Как продолжить использование Generics в Java - PullRequest
0 голосов
/ 28 июня 2011

У меня есть интерфейс

public interface Doable<T,U> {
    public U doStuff(T t);
}

У меня есть абстрактный класс, который реализует Doable<T,U>

public abstract class AbstractDoable<T,U> implements Doable<T, U> {
    private SomeClass someClass;

}

Теперь мне нужно реализовать вышеупомянутые классы, но мне нужно использовать разные классы для T и U.

Пожалуйста, предложите, как мне поступить, так как мне потребуется несколько реализаций AbstractDoable с разными T и U. Например:

ConvertDoable<String,Integer> extends AbstractDoable

или

ConvertDoable<A,B> extends AbstractDoable

Ответы [ 5 ]

2 голосов
/ 28 июня 2011

Вы можете создать любые подклассы Doable или AbstractDoable, которые вы хотите.Например:

public class DoNothing implements Doable<String, String> {
    public String doStuff(String input) {
        return input;
    }
}

или

public class DoSomething extends AbstractDoable<Integer, String> {
    public String doStuff(Integer i) {
        return i.toString();
    }
}

Я не уверен, что цель вашего someClass участника в AbstractDoable.Можете ли вы объяснить, для чего это?

1 голос
/ 28 июня 2011
interface Doable<T,U> {
    public U doStuff(T t);
}

abstract class AbstractDoable<T,U> implements Doable<T, U> {
}

class ConvertDoableStringInteger extends AbstractDoable<String, Integer>{
    public Integer doStuff(String t) {
        return null;
    }   
}

class ConvertDoableIntergerFloat extends AbstractDoable<Integer, Float> {
    public Float doStuff(Integer t) {
        return 0.0f;
    }   
}
1 голос
/ 28 июня 2011

Ваши конкретные реализации должны либо указывать типы на AbstractDoable

public class ConvertDoable extends AbstractDoable<String,Integer>
{
    public Integer doStuff(String arg){...}
}

, либо продолжать передавать параметризованные обобщения:

public class ConvertDoable<T,U> extends AbstractDoable<T,U>
{
    public U doStuff(T arg){...}
}
1 голос
/ 28 июня 2011

Если вы беспокоитесь о раздувании классов, рассмотрите анонимные классы - классы, определенные «на лету», как вам нужно:

public static void main(String[] args) {
    Doable<String, Integer> myDoable = new AbstractDoable<String, Integer>() {
        public Integer doStuff(String t) {
           return new Integer(t); // for example
        }
    }

    Integer i = myDoable.doStuff("0");
}
0 голосов
/ 28 июня 2011

Вся идея об обобщениях заключается в том, что вы создаете один класс, который поддерживает все типы классов (или, по крайней мере, все классы, которые наследуются от класса или реализуют интерфейс).

Также в Java (байт-код) нет разницы между скажем

GenericClass<A,B> foo;

и

GenericClass<C,D> bar;

Таким образом, вам нужно определить один класс, который может обрабатывать все различные объекты, которые могут быть ему предоставлены.

...