2013-12-12 2 views
2

У меня есть что-то вроде:Предупреждение в Java абстрактного универсального метода

public abstract class Base{ 
    public abstact T <T> method(); 
} 

public class ExtendingClass extends Base{ 
    public SomeObject method(){ 
    } 
} 

Однако ExtendingClass#method имеет предупреждение Тип безопасности: Возвращение типа SomeObject для метода от типа ExtendingClass необходимо беспрепятственное преобразование, чтобы соответствовать Т из тип Base

Не могли бы вы рассказать мне, почему это и как это следует обрабатывать?

+0

понижающего голос от меня - текущий пример кода сломана. Класс 'Base' не компилируется. Примечание. Я отбросил одно редактирование, которое попыталось исправить это (но это не так) - только ОР должен редактировать код в вопросе. –

+2

Нужно ли это, если это просто покажет пример проблемы? Он сказал «что-то вроде» –

+0

@ RossDrew Я так думаю. Существует целая причина, связанная с отсутствием кода, который демонстрирует конкретную проблему. Теперь это не самый худший пример того, что я видел, но я ожидаю немного точности усилий от OP. –

ответ

3

вы можете использовать:

public abstract class Base<T> { 
    public abstract T method(); 
} 

и:

public class ExtendingClass extends Base<SomeObject >{ 

    public SomeObject method(){ 
     ... 
    } 

} 

Это происходит потому, что общие параметры не появляются нигде, кроме как в вашем объявлении абстрактного метода.

Эта подпись метода почти эквивалентна public abstract Object method().

От Java generic methods tutorial:

Общие методы позволяют параметры типа, которые будут использоваться для выражения зависимостей между типами одного или более аргументов к способу и/или ее тип возвращаемого значения. Если такой зависимости не существует, общий метод не должен использоваться.

+1

Это не объясняет, почему он получает предупреждение :) –

+0

Я пробовал эту штуку, и предупреждение есть. Цель не вернуть объект «Объект» сложнее, мне нужно сохранить «Т». – Roxana

+0

Вы пытались сделать Base generic? можете ли вы добавить свой общий базовый код здесь? – BobTheBuilder

1
abstract class Base <T> { 
    public abstract T method(); 
} 



public class test extends Base<String>{ 

    @Override 
    public String method(){ 
     return null; 

    } 
} 

Когда вы пишете конкретный пример вы должны пройти соответствующее значение для него, так что компилятор может проверить значение во время компиляции

+0

@kocko: Я уже упоминал в своем ответе, что «компилятор может проверить значение во время компиляции» – Sach

+0

Я пробовал эту штуку, и предупреждение есть , Цель не вернуть объект «Объект» сложнее, мне нужно сохранить «Т». – Roxana

+0

@ Roxana: Eclipse не дает мне никаких предупреждений :( – Sach

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