Как использовать String.format в Java 8?

Сегодня написал простенькую программу на eclipse Kepler в java 8. Собственно, скопировал из какого-то видеоурока. В этом уроке он работал, а на моем компьютере - нет. Строка ошибки

 String.format("%02d:%02d:%02d",hour,minute,second);

Я не понимаю, в чем здесь ошибка. Он выделяет метод format(String,object[]) в типе String, неприменим для argument(String, int, int, int)

public class Demo {

private int hour;
    private int second;
    private int minute;

    public void setTime(int h,int m,int s){
        hour=((h>=0 && h<24)?h:0);
        minute=((m>=0 && m<60)?m:0);
        second=((s>=0 && s<60)?s:0);
    }

    public String railwayTime(){
        return String.format("%02d:%02d:%02d",hour,minute,second);//error in this line
    }

    public String regular(){
        return String.format("%02d:%02d:%02d %s",((hour==0 ||hour==24)?12:(hour%12)), minute, second, (hour>=12)?"AM":"PM");//error in this line
    }
}

public class ShowTime {
    public static void main(String[] args){
        Demo d=new Demo();
        System.out.println(d.railwayTime());
        System.out.println(d.regular());
    }
}

person rajeev ranjan    schedule 25.05.2015    source источник
comment
Как указано в исключении, вы должны предоставить аргументы форматирования в виде массива, а не в виде отдельных аргументов.   -  person Vadim Landa    schedule 25.05.2015
comment
Использование Java 8 здесь. Я не могу воспроизвести эту ошибку. Как вы думаете, вы могли бы показать нам еще немного кода? А вы уверены, что тоже используете Java 8?   -  person PakkuDon    schedule 25.05.2015
comment
String.format представлен в Java 5, и с тех пор он принимает Object..., я просто не понимаю, как вы неправильно использовали стандартную библиотеку для получения такого результата.   -  person Dmitry Ginzburg    schedule 25.05.2015
comment
Прочитайте это: Что такое уровень соответствия компилятора в Eclipse?, установите свой уровень на java 8 и тогда будьте счастливы.   -  person Tom    schedule 25.05.2015


Ответы (3)


Исключение запрашивает массив вместо строк, разделенных запятыми:

// incorrect
String.format("%02d:%02d:%02d",hour,minute,second);

// fast but correct
Object[] data = { hour, minute, second };
String.format("%02d:%02d:%02d", data);

Но на самом деле метода format(String,object[]) в String нет, это: format(String pattern, Object... arguments) то, что должно работать с запятыми ,. Что-то с вашим синтаксисом, но не в показанном коде.

person Jordi Castilla    schedule 25.05.2015
comment
Кроме того, наверняка hour, minute и second являются int, поэтому это не скомпилируется. Вы должны создать data как Object[] data = ... - person Dmitry Ginzburg; 25.05.2015
comment
@rajeevranjan Какова была предыдущая настройка уровня соответствия, из-за которой возникла ошибка, которую вы видели? - person Stuart Marks; 25.05.2015
comment
@StuartMarks Скорее всего, Java 1.4. В некоторых IDE это стандартный уровень, если вы не определяете что-то еще. - person Tom; 25.05.2015
comment
@Tom Да, это должно быть 1.4, если varargs не поддерживается. Но может ли по умолчанию для Eclipse Kepler (выпущенный в 2013 г.) действительно быть 1.4 (выпущенный в 2002 г.)? - person Stuart Marks; 25.05.2015
comment
@StuartMarks К сожалению, это так. Я не уверен на 100%, является ли это проблемой с самим Eclipse или с установленным JDK, но я сам испытал это во время работы с Eclipse. Я использую IntelliJ, и в настоящее время по умолчанию используется Java 6 (с установленным JDK 8). Какой-то отстой :D. - person Tom; 25.05.2015

Реальным ответом на эту проблему является только ваш тип int. Вам не нужно специально использовать Object, но вы должны использовать тип, который наследуется от Object, а int — это необработанный тип, который не наследуется от Object, как и все необработанные типы. Таким образом, вы можете использовать Integer вместо int для решения вашей проблемы.

person Mathan    schedule 29.12.2015

Я знаю, что это старо, но у меня есть предположение.

private int hour;
private int second;
private int minute;

Как и выше, вы объявили hour, second и minute как тип int, который является примитивным типом данных и несовместим с типом Object.

Вы можете изменить их на:

private Integer hour;
private Integer second;
private Integer minute;

Integer является оболочкой примитивного типа int и используется для его объективации. К тому времени линия String.format("%02d:%02d:%02d",hour,minute,second); должна работать нормально.

person Someone    schedule 30.01.2019