2015-01-10 5 views
2

У меня есть абстрактный универсальный метод в абстрактном классе:Реализация абстрактного универсального метода

/** 
* @param <Value> 
*/ 
public abstract class TestAbstract<Value> { 

    public abstract <Value> void test(Value value); 

}  

Сейчас проходит от этого класса и реализовать абстрактный общий метод - это моя попытка, но это явно не так.

public class Impl extends TestAbstract<Integer> { 

    @Override 
    public <Integer> void test(Integer value) { 

     // value is instanceOf as java.lang.Object and not java.lang.Integer ! 

    } 

} 

test() В value рассматривается как Object, а не как Integer ...

Как я могу переопределить этот метод, так что я вынужден использовать «integer'-Class?

Спасибо!

+1

Является ли 'Value' фактическим классом в вашем проекте? – Bobulous

+0

Нет. Я хочу, чтобы значение являлось параметром для этого абстрактного класса ... – peddn

+0

@peddn: Немного непонятно, что вы имеете в виду под «обработанным как« объект », можете ли вы быть более конкретным? Значение –

ответ

3

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

public abstract class TestAbstract<V> { 
    public abstract void test(V value); 
}  

(заметим, что по соглашению, параметры типа должны быть одной заглавной буквы, если это возможно)

Теперь, когда вы создаете конкретную реализацию этого класса , вы можете заменить конкретный тип этого параметра типа:

public class Impl extends TestAbstract<Integer> { 

    @Override 
    public void test(Integer value) { 
     // Here, "value" is an Integer 
    } 
} 

в этом случае вам не нужен параметр типа для самого метода, так как он определен в окружающих условиях (а именно, в классе).

+0

Спасибо! Это была именно эта проблема! – peddn

+0

@ Marco13 - Вы написали, что «вам не нужен параметр типа для самого метода». _Can_ вы делаете это на уровне метода, а не на уровне класса, или это должно выполняться на уровне класса? – risingTide

+0

@risingTide Это возможно на уровне метода, см. Http://docs.oracle.com/javase/tutorial/java/generics/methods.html – Marco13

1

test в Impl не предназначен для общего метода. Он должен применяться только к классу Integer. Поэтому вам просто нужно изменить

public <Integer> void test(Integer value) 

к

public void test(Integer value) 
+0

Действительно, здесь он рассматривается как * общий метод *, хорошо замеченный! Возможно, вам следует предоставить ссылку на общие методы, чтобы сделать ее более понятной ... –

1

Изменение абстрактного к этому:

public abstract class SuperClass<T> { 
    public abstract void test(T value); 
} 

И подкласса:

public class SubClass extends SuperClass<Integer> { 
    public void test(Integer value) { 
    } 
} 

И он работает сейчас , так как больше нет параметра скрывая проблему.

+0

Спасибо! Это решило проблему! – peddn

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