Абстрактные методы в числовом классе - PullRequest
3 голосов
/ 18 апреля 2011

Почему класс чисел предоставляет абстрактные методы для методов преобразования для Double, Int, Long и Float, но не абстрактные методы для байта и короткого кода?

В целом, я немного озадачен тем, когда использовать абстрактные методы, так как я только начал изучать Java.

Спасибо за любые идеи, которые кто-либо может предложить.

1 Ответ

4 голосов
/ 18 апреля 2011

Один взгляд на источник для них говорит, почему:

public byte byteValue() {
    return (byte)intValue();
}

public short shortValue() {
    return (short)intValue();
}

Они оба полагаются на тот факт, что intValue() будет определен, и просто используют все, что они для этого предоставляют.

Это заставляет меня задуматься, почему они не просто делают

public int intValue() {
    return (int)longValue();
}

Так как применяется то же правило.

Обратите внимание, что ничто не говорит о том, что вы все равно не можете переопределить эти методы. Они не должны быть абстрактными для вас, чтобы переопределить их.

Результаты на моей машине:

C:\Documents and Settings\glow\My Documents>java SizeTest
int: 45069467
short: 45069467
byte: 90443706
long: 11303499

C:\Documents and Settings\glow\My Documents>

Класс:

class SizeTest {

    /**
     * For each primitive type int, short, byte and long,
     * attempt to make an array as large as you can until
     * running out of memory. Start with an array of 10000,
     * and increase capacity by 1% until it throws an error.
     * Catch the error and print the size.
     */    
    public static void main(String[] args) {
        int len = 10000;
        final double inc = 1.01;
        try {
            while(true) {
                len = (int)(len * inc);
                int[] arr = new int[len];
            }
        } catch(Throwable t) {
            System.out.println("int: " + len);
        }

        len = 10000;
        try {
            while(true) {
                len = (int)(len * inc);
                short[] arr = new short[len];
            }
        } catch(Throwable t) {
            System.out.println("short: " + len);
        }


        len = 10000;
        try {
            while(true) {
                len = (int)(len * inc);
                byte[] arr = new byte[len];
            }
        } catch(Throwable t) {
            System.out.println("byte: " + len);
        }

        len = 10000;
        try {
            while(true) {
                len = (int)(len * inc);
                long[] arr = new long[len];
            }
        } catch(Throwable t) {
            System.out.println("long: " + len);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...