Расширить Object [] для универсального типа - PullRequest
1 голос
/ 04 июля 2019

Я пытаюсь определить универсальный метод, который может печатать массив типа объекта. Я написал следующий код:

class ArrayPrinter
{
    public <T extends Object[]> void printArray(T t) {
        for(Object o: t) {
            System.out.println(o);
        }
    }  
}
public class javaGenerics {
    public static void main(String args[]) {
        ArrayPrinter myArrayPrinter = new ArrayPrinter();
        Integer[] intArray = {1, 2, 3};
        String[] stringArray = {"Hello", "World"};
        myArrayPrinter.printArray(intArray);
        myArrayPrinter.printArray(stringArray); 
    }
}

Но он не работает и выдает следующую ошибку:

javaGenerics.java:7: error: unexpected type
    public <T extends Object[]> void printArray(T t) {
                            ^
  required: class
  found:    Object[]
1 error

Я могу по ошибке понять, что я предоставляю имя класса. Но я не знаю, каким будет имя класса для массива объектов.

Ответы [ 5 ]

3 голосов
/ 04 июля 2019

Я бы изменил printArray на

public <T extends Object> void printArray(T[] t) {
    for(Object o: t) {
        System.out.println(o);
    }
}  

То есть позволить T расширять объект, а не массив объектов, и делать массив из T.

На самом деле нет необходимости расширять объектвообще, так как параметр типа всегда является непримитивным типом

public <T> void printArray(T[] t) {
    for(Object o: t) {
        System.out.println(o);
    }
}
2 голосов
/ 04 июля 2019

Вам не нужны дженерики здесь:

public void printArray(Object[] t) {
    for(Object o: t) {
        System.out.println(o);
    }
}

Это будет хорошо работать, потому что массивы Java ковариантны.

2 голосов
/ 04 июля 2019
public <T>  void printArray(T[] t) {
        for (Object o : t) {
            System.out.println(o);
        }
    }

должен быть верным путем.

Вместо

public <T extends Object[]> void printArray(T t) {
        for(Object o: t) {
            System.out.println(o);
        }
    }  
0 голосов
/ 04 июля 2019

Я предполагаю, что вы пытались создать метод, который принимает массив объектов любого типа.В этом случае вы можете использовать следующее.

public <T> void printArray(T[] array) {
        for(T t: array) {
            System.out.println(t.toString());
        }
    }

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

    public  void printArray(Object[] array) {
        for(Object o: array) {
            System.out.println(o.toString());
        }
    }

Если вы действительно хотите расширить класс массивасамо по себе, оказывается, вы просто не можете: https://www.quora.com/Why-cant-the-array-class-in-Java-be-extended

0 голосов
/ 04 июля 2019

Я бы добавил к другим ответам следующее объяснение.

Массив - это Объект, но у него нет ни класса, ни самого типа. Вы можете расширить класс, но не массив или любую другую группу объектов в Java. Ни одна группа объектов не может иметь определенного определения класса. Массив - это способ резервирования N указателей в памяти для указания ссылок на несколько объектов в случае объектов или значения в случае примитивы. Поэтому простирается от массива не определено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...