2014-12-29 2 views
0

У меня этот вопрос:Java возвращение обобщенного типа, который расширяет интерфейс

public interface Node { 
    public<T extends Node> T copy(); 
} 

public class Point2D implements Node { 
    @Override 
    public <T extends Node> Point2D copy() { 
     return new Point2D(this); 
    } 
} 

Почему я получаю The return type is incompatible with Node.copy()? Point2D реализует Node, как я могу сделать ошибку dissapear, сохраняя возвращаемый тип? Если я ставлю T вместо этого, если Point2D копия() я получаю «Несоответствие типа: не может конвертировать из Point2D Т», который глупо, потому что T определяется как класс, который расширяет Point2D

Благодаря

+0

Общий метод параметризуется, когда он * называется *. То, что вы пытаетесь сделать, не имеет смысла (рассмотрите такой код: «Node node = new Point2D(); Foo something = copy(); // пытается вызвать« T copy() »с T == Foo '). –

ответ

0

Вы не требуется <T extends Node> декларация для T в классе детей.
Используйте просто

public class Point2D implements Node { 
    @Override 
    public Point2D copy() { 
     return new Point2D(this); 
    } 
} 
+0

Спасибо, похоже, он работает. – yonutix

+0

Это опасно, хотя: http://ideone.com/8kCKvX. [CRTP] (http://stackoverflow.com/questions/2165613/java-generic-type), вероятно, здесь требуется. –

+0

@OliverCharlesworth Вы пытаетесь использовать 'Point2D' для' Point3D'. Это две разные реализации, вы не можете этого сделать. – Ilya

0

Вам не нужно использовать переменные типа в этом случае. Java позволяет вам специализировать тип возвращаемого значения в переопределенных методах. То есть, следующие работы:

public interface Node { 
    public Node copy(); 
} 

public class Point2D implements Node { 
    @Override 
    public Point2D copy() { 
     return new Point2D(this); 
    } 
} 

Причина, по которой это работает, является то, что интерфейс Node указывает, что метод copy() возвращает Node экземпляр. Метод Point2D класса copy() возвращает экземпляр Node; на самом деле он возвращает экземпляр подтипа Point2D.

+0

Вы предлагаете идентичное решение существующего ответа. Но читайте здесь комментарии, почему это не здорово. –

+0

@OliverCharlesworth Нет, решение не идентично, потому что также был изменен интерфейс Node: возвращаемый тип 'copy()' здесь 'Node', а не' T'. Код на веб-сайте, на который вы ссылаетесь, не компилируется, потому что вы не можете (неявно) сбрасывать из 'Node' в' Point3D'. – Hoopje

+0

Извинения, я не заметил, что вы изменили определение интерфейса «Узла» (если вы сделаете фиктивное редактирование на свой пост, тогда я смогу удалить нижний предел). –

Смежные вопросы