Почему ArrayList <String>get () возвращает объект, а не строку в Java - PullRequest
0 голосов
/ 17 января 2020

При создании анализатора аргументов я использовал ArrayList<String>.
Ссылаясь на эту официальную документацию , ArrayList<E>.get() должен возвращать E типизированных объектов, поэтому ArrayList<String>.get() должен возвращать String Объекты.

Однако в этом случае я получаю объект вместо элементов String.

enter image description here

import lombok.Data;

import java.util.ArrayList;

@Data
public class Argument<T> {
    public ArrayList<String> Args;
    public String Description;
    public Boolean Required;
    public Boolean HasValue;
    public T Value;
}
import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;

public class ArgumentParser {
    private ArrayList<Argument> argumentList_;

    public String ArgList() {
        StringBuilder builder = new StringBuilder(); 
        for (Argument argument : argumentList_) {

            //Here is the problem
            for (String arg : argument.Args) {
                builder.append(arg);
                builder.append(", ");
            }
        }
        //Delete Traling Comma
        builder.delete(builder.length());
        builder.delete(builder.length());

        return builder.toString();
    }
}

Является ли эта ситуация

  1. Ошибка в среде IDE (IntelliJ + Lombok)
  2. Мой код заставляет Java сделать это (Generi c Typing)

Помогите мне ...

1 Ответ

4 голосов
/ 17 января 2020

В первом фрагменте кода Argument определен как параметр типа.

public class Argument<T> {
    public ArrayList<String> Args;

Во втором фрагменте кода используется Argument, но аргумент типа отсутствует.

    private ArrayList<Argument> argumentList_;
    // ...
        for (Argument argument : argumentList_) {

ArrayList<Argument> - это редкий тип (реже (?) Известный как частичный необработанный тип - тип с необработанным аргументом типа). Поведение которых является странным.

Простое исправление - это подстановочный знак.

    private ArrayList<Argument<?>> argumentList_;
    // ...
        for (Argument<?> argument : argumentList_) {
...