2017-02-21 6 views
0

У меня есть класс JavaJava ArrayList addAll с родовым типом

public class PointCloud<T extends Point> 
{ 
    protected ArrayList<T > points = null; 

    public ArrayList<T> getPoints() 
    { 
     return points; 
    } 

    public void addPoints(ArrayList<T> arrayList) 
    { 
     this.points.addAll(arrayList); 
    } 

    public static PointCloud<? extends Point> combine(ArrayList<PointCloud<? extends Point>> pcList) 
    { 
     PointCloud<? extends Point> combinated_pc = new PointCloud<>(); 

     for(PointCloud<? extends Point> pc: pcList) 
     { 
      combinated_pc.addPoints(pc.getPoints()); 
     } 

     return combinated_pc; 
    } 
} 

Моя ошибка Java является:

Метод addPoints(ArrayList < capture#8-of ? extends Point>) в типа PointCloud<capture#8-of ? extends Point> не применяются для аргументов (ArrayList < capture#9-of ? extends Point>)

ответ

0

Здесь вы должны указать правильный общий тип в используйте метод addPoints.

Изменение вашего комбайна со следующими ..

public static <P extends Point> PointCloud<P> combine(ArrayList<PointCloud<P>> pcList) { 
    PointCloud<P> combinated_pc = new PointCloud<>(); 
    for(PointCloud<P> pc: pcList) { 
     combinated_pc.addPoints(pc.getPoints()); 
    } 
    return combinated_pc; 
} 

Если вы заинтересованы в объединении различных объектов, вы должны изменить метод addPoints.

+0

Спасибо за ваш ответ, проблема здесь в том, что метод статичен, поэтому T невозможно. – Morkhitu

+0

@ Morkhitu на самом деле вы этого не понимаете. Типичный тип T применяется, поскольку он является статическим. Посмотрите внимательно. T не является типом возврата. Тип возврата - 'PointCloud '. Вам нужно научиться использовать generics для статических методов. –

+0

@Morkhitu Я отредактировал свой ответ, чтобы решить ваше непонимание с T, используемым в защите класса. –