Проблемы при расширении AbstractStringBuilder и использовании подкласса в Hashtable

Я хочу расширить AbstractStringBuilder и получить класс, аналогичный StringBuilder, но с методом hashCode(), идентичным String.hashCode(). Намерение состоит в том, чтобы использовать этот новый подкласс в качестве ключа в Hashtable. Я хочу поэкспериментировать с Hashtable и этим новым подклассом и посмотреть, что получится, потому что, в конце концов, я хочу решить некоторые проблемы с памятью, которые StringBuilder решает некоторые из них, но не все. Итак, вот подкласс,

import java.lang.*;

public final class StringCon extends AbstractStringBuilder implements java.io.Serializable, CharSequence
{
    public StringCon()
    {
        super( 16);
    }

    public StringCon( int capacity)
    {
        super( capacity);
    }

    public StringCon( String str)
    {
        super( str.length() + 16);
        append( str);
    }

    public StringCon append( Object obj)
    {
        return append( String.valueOf( obj));
    }

    public StringCon append( String str)
    {
        super.append( str);
        return this;
    }

    public StringCon delete( int start, int end)
    {
        super.delete( start, end);
        return this;
    }

    public StringCon delete( int start)
    {
        super.delete( start, this.length());
        return this;
    }

    public int indexOf( String str)
    {
        return indexOf( str, 0);
    }

    public int indexOf( String str, int fromIndex)
    {
        return String.indexOf( value, 0, count, str.toCharArray(), 0, str.length(), fromIndex);
    }

    public int hashCode()
    {
        int hash = 0;
        int h = hash;
        if( h == 0 && count > 0)
        {
            int off = 0;
            char val[] = value;
            int len = count;
            for( int i = 0; i < len; i++)
                h = 31*h + val[ off++];

            hash = h;
        }
        return h;
    }
}

Я реализую только те методы, которые собираюсь использовать. Вопросы таковы,

1) Компилятор не находит значение символов, количество и даже ключевое слово super. Эти символы определены в AbstarctStringBuilder, и StringBuilder использует их свободно. Почему?

2) Компилятор не может найти метод AbstractStringBuilder.substring(). Почему?

3) я получаю ошибку,

error: type argument StringCon is not within bounds of type-variable E

в заявлении

hth = ( j + 1 < al.size()) ? new Hashtable< StringCon, LinkedList< StringCon>>( al.get( j + 1).size(), 0.75F) : null; 

4) получаю ошибку

error: method containsKey in class Hashtable<K,V> cannot be applied to given types;
                    if( hth.isEmpty() || !hth.containsKey( nextKey))
                                             ^
required: Object
found: StringCon
reason: actual argument StringCon cannot be converted to Object by method invocation conversion
where K,V are type-variables:
 K extends Object declared in class Hashtable
 V extends Object declared in class Hashtable

где nextKey — это объект StringCon.

Различные методы выше я скопировал из классов StringBuilder и String.

Что я не понимаю, где мои ошибки? Я использую все вышеперечисленное в контексте Hadoop, если это имеет какое-либо значение.


person vpap    schedule 21.09.2013    source источник
comment
Каков полный тип hth?   -  person VGR    schedule 21.09.2013
comment
Пожалуйста, покажите строку, в которой впервые объявляется переменная/поле hth.   -  person VGR    schedule 21.09.2013
comment
Прямо из кода: Hashtable‹ StringCon, LinkedList‹ StringCon›› hth = null; hth = new Hashtable‹ StringCon, LinkedList‹ StringCon››(someSize, 0,75F); где someSize меняется от итерации к итерации.   -  person vpap    schedule 21.09.2013


Ответы (1)


java.lang.AbstractStringBuilder не является public, поэтому его можно расширить только другими классами в java.lang. Попытка скомпилировать ваш код дает первую ошибку:

StringCon.java:3: java.lang.AbstractStringBuilder is not public in java.lang;
cannot be accessed from outside package

Использование изменяемого класса в качестве ключа в хеш-таблице обычно не рекомендуется (Изменяемая хэш-карта ключи опасная практика?). Возможно, есть лучший способ решить вашу проблему:

потому что, в конце концов, я хочу решить некоторые проблемы с памятью, которые StringBuilder решает некоторые из них, но не все из них

Попробуйте задать прямой вопрос о проблемах с памятью.

person Joe    schedule 21.09.2013
comment
Большое спасибо! Я решил спросить напрямую о проблемах с памятью, stackoverflow.com/questions/18949658/ :) Ваш ответ также был хорошим уроком: сначала посмотреть весь вывод компилятора, а не его часть. - person vpap; 23.09.2013