2016-10-19 5 views
0

У меня есть этот код:Java Generics вопросы для многожильного типа параметров

public interface IDimension<S extends IDimension<S,T>, T extends Number> extends Comparable<S> { 
    T toNumber(); 

    default T toBaseNumber() { 
    return toNumber(); 
    } 

    S fromNumber(T units); 

    Class<T> numberType(); 
} 

Когда я реализовать IDimension, как показано ниже (Implementation1), я получаю 'Type parameter 'TestBaseSample' is not within its bound; should implement 'IDimension<TestBaseSample<Float,Integer>, java.lang.Long>' ошибка:

выполнения решений1:

class TestBaseSample<Integer, Float> 
    implements IDimension<TestBaseSample<Float, Integer>, Long> { 
} 

Я понимаю, почему «Реализация1» дает ошибку, но не может понять, почему «Реализация2» и «Реализация3» работают?

выполнение решений2:

class TestBaseSample2<Integer, Float> 
    implements IDimension<TestBaseSample2<Float, Float>, Long> { 
} 

Implementation3:

class TestBaseSample3<Integer, Float> 
    implements IDimension<TestBaseSample3<Integer, Integer>, Long> { 
} 
+3

Вы понимаете, что вы делаете Integer и Float в имена переменных? например. 'class TestBaseSample3 ' где T и S являются типичными типами. Например, http://ideone.com/Zq4AVt. Возможно, вы должны изменить их на T & S, чтобы это было ясно или сделать их конкретными. 'class TestBaseSample3 реализует ...' – matt

+1

@matt вы должны превратить это в ответ. –

ответ

1

Похоже, что вы пытаетесь создать конкретный тип, но вы на самом деле создаете общие параметры и давая им имена классов Java.

Рассмотрим первый пример TestBaseSample2 если изменить общие параметры для T и S

class TestBaseSample2<T, S> 
    implements IDimension<TestBaseSample2<S, S>, Long> { 
} 

Теперь, вы должны быть в состоянии сделать экземпляр при условии S является Long и T может быть что-нибудь еще.

Вот более простой пример.

static class OtherList<Integer> extends ArrayList<Integer>{} 

public static void main (String[] args) throws java.lang.Exception 
{ 
    OtherList<String> list = new OtherList<>(); 
    list.add("this"); 
    System.out.println(list.size()); 
} 
0

Извлеките все типы из ваших реализаций (и никогда не называть общие параметры, используя имена классов, особенно классы из JDK - использовать отдельные буквы):

class TestBaseSample implements IDimension<TestBaseSample, Long> { 
} 

class TestBaseSample2 implements IDimension<TestBaseSample2, Long> { 
} 

class TestBaseSample3 implements IDimension<TestBaseSample3, Long> { 
} 
Смежные вопросы