Можно ли расширить универсальный параметр класса в Java? - PullRequest
1 голос
/ 11 августа 2009

Имеет ли что-то подобное смысл в Java?

class A<T extends B> extends T{ 
  int fun1() {
    ....
  }      
}

abstract class B extends X implements C {

}

interface C {
  int fun1();
}

Я хочу, чтобы класс B идеально расширял X и C. Но поскольку в Java нет множественного наследования, я пытаюсь найти обходной путь.

Хитрость в том, что материал, который будет определен в C, определен в суперклассе "A". Проблема в том, чтобы получить A, позвольте мне использовать универсальный тип после "extends"

Мысли

Ответы [ 4 ]

4 голосов
/ 11 августа 2009

Нет, вы не можете заставить тип расширять класс, указанный в качестве параметра типа

Не зная, что такое A, B, C или X, очень боюсь рекомендовать альтернативный шаблон дизайна, я боюсь.

2 голосов
/ 11 августа 2009

То, что вы пытаетесь сделать, не сработает - дженерики Java не имеют ничего общего с наследованием. Нет множественного наследования, вам придется помириться с этим: -)

Вы можете объявить несколько интерфейсов и использовать агрегацию, чтобы «подделать» множественное наследование.

1 голос
/ 11 августа 2009

Как уже говорили другие, дженерики не помогут вам с множественным наследованием реализаций.

Мой обходной путь, чтобы не повторяться из-за множественного наследования, обычно состоит в том, чтобы написать общую реализацию в статическом методе в суперклассе и делегировать его из тех мест, где это необходимо.

Самый простой пример будет выглядеть так:

class A
{
}

class B extends A 
{
}

interface C
{
    void foo();
}

class CBase extends A implements C
{
    public void foo()
    {
        sFoo(this);
    }

    static void sFoo(C c)
    {
        // Implement foo here
    }
}

class D extends B implements C
{
    public void foo()
    {
        CBase.sFoo(this);
    }
}

Обратите внимание, что для того, чтобы сделать это полезным, было бы больше операций, унаследованных от D от B и A, которые не показаны в этом примере.

0 голосов
/ 11 августа 2009

Параметр type является только заполнителем для дженериков только во время компиляции, это фактический тип.

Попытка найти обходное решение для множественного наследования на языке, который его не поддерживает, вероятно, является хорошим показателем того, что в дизайне есть недостаток. Сказать A<T extends B> extends T, очевидно, не удастся, поскольку это даже не означает, что вы надеетесь, что это означает - <T extends B> означает только то, что T имеет тип, который является B. Добавление extends T ничего не значит, потому что T не определено в этом классе. Опять же, это тип во время компиляции - фактический тип T не доступен напрямую во время выполнения.

Вы действительно уверены, что наиболее правильно достигается с помощью множественного наследования, а не композиции? Также возможно, что вы пытаетесь заставить A сделать слишком много вещей.

Более конкретный пример может позволить другим дать больше отзывов о самом дизайне.

...