Java «неконтролируемый вызов compareTo (T) как члена необработанного типа java.lang.Comparable»

Я пытаюсь реализовать отсортированный список как простое упражнение на Java. Чтобы сделать его универсальным, у меня есть add (Comparable obj) , поэтому я могу использовать его с любым классом, реализующим интерфейс Comparable.

Но когда я использую obj.compareTo (... ) где-нибудь в коде я получаю "неконтролируемый вызов compareTo (T) как член необработанного типа java.lang. использование памяти и скорость) использования этого подхода вместо объявления String как final и замены всех литералов конечной переменной?

Например (хотя, очевидно, это не настоящее слово):

private static final String FINAL_STRING = "foo";

public void stringPrinter(){
    for(int i=0;i<10;i++){
        System.out.println(FINAL_STRING);
    }
}

Versus:

public void stringPrinter(){
    for(int i=0;i<10;i++){
        System.out.println("foo");
    }
}

Which является предпочтительным и почему (при условии, что строковое значение останется постоянным)?

Приведет ли приведенный выше (второй) пример к созданию 10 строковых объектов или JVM поймет, что фактически используется только один литерал, и создаст единственную ссылку . Если да, то есть ли какое-либо преимущество для объявления String как final (как в первом примере)?

Если интерпретируемый код действительно заменяет строковый литерал одной ссылкой, применяется ли это, если тот же литерал встречается более чем в одно место:

public void stringPrinter(){
    for(int i=0;i<5;i++){
        System.out.println("foo"); // first occurence
        System.out.println("foo"); // second occurence
    }
}
32
задан TylerH 8 August 2019 в 15:34
поделиться