различные реализации для абстрактного универсального класса - PullRequest
1 голос
/ 19 октября 2011

У меня есть следующий класс:

abstract class MyAbstract<T>
{
    T val_;
    MyAbstract(T val)
    {
        val_ = val;
    }
    T getVal()
    {
        return val_;
    }
}

Я бы хотел, чтобы у моего абстрактного класса было другое тело для T = String, например (несите меня):

abstract class MyAbstract<T extends String>
{
    T val_;
    T upperVal_;
    MyAbstract(T val)
    {
        val_ = val;
        upperVal_ = val.toUpperCase();
    }
    T getVal()
    { 
        return upperVal_; 
    }
}

Результат, которого я пытаюсь достичь, заключается в том, что если я расширю MyAbstract, будет использована вторая версия, в противном случае - первая.Это возможно и как?Спасибо!

Обновление: я хочу иметь возможность расширять тот же абстрактный класс и делать такие вещи, как:

Type1 extends MyAbstract<Integer>...

и

Type2 extends MyAbstract<String>...

(обратите внимание, что я используюMyAbstract для обоих типов)

Ответы [ 2 ]

2 голосов
/ 19 октября 2011

Сделайте вторую реализацию extend первой.

abstract class MyAbstract2<T extends String> extends MyAbstract<T>
{
    T upperVal_;

    MyAbstract(T val)
    {
        super(val);
        upperVal_ = val.toUpperCase();
    }

    @Override
    T getVal()
    { 
        return upperVal_; 
    }
}
0 голосов
/ 19 октября 2011

Java не поддерживает специализацию шаблонов, как в C ++. В частности, все экземпляры объявления универсального класса совместно используют один и тот же класс времени выполнения и, следовательно, имеют одинаковый набор полей.

Что бы вы ни пытались сделать, вам придется делать это по-другому в Java.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...