2013-11-06 2 views
0

Я занимаюсь дженериками, и я сделал следующее.Тип параметра E скрывает тип E. Пробовал разные варианты и все еще не мог исправить

Создал класс, называемый человеком, как показано ниже.

public class Man { 
    int hands=2; 
    int legs=2; 
    boolean alive; 

    public Man(boolean b) { 
     // TODO Auto-generated constructor stub 
     alive=b; 
    } 
} 

создал класс с именем человек

public class Person<Man> { 
    Man p; 
    String name; 


    public Person(Man p, String name) { 
     this.p = p; 
     this.name = name; 
    } 

    public Person() { 
     // TODO Auto-generated constructor stub 
    } 

} 

пытался создать экземпляр человека типа String или INT, как показано ниже, и это не бросать и ошибки.

Person<String> p1 = new Person<String>(new String("test"), "test1"); 
Person<Integer> p2=new Person<>(1,"test"); 

Теперь я изменил класс подпись

public class Person<T extends Man>{} 

И я больше не могу создать человек типа String. Почему это случилось? Я хочу, чтобы класс человека был строго человеком, а не мутантом, который является подклассом Человека. Как мне это сделать?

я даже попытался сделать ниже

public abstract class AliveBeing<T>{} 

сделал AliveBeing суперкласс Man, а затем попытался

public class Person<Man> extends AliveBeing<Man>{} 

Даже сейчас Man в Person<Man> имеет желтую линию под ним (тип параметра Человек скрывает тип Man), а Man in AliveBeing - нет.

Почему компилятор только путают насчет Man в Person<Man>?

ответ

1

Хорошо, у вас есть четыре разных вопроса, но я попробую!

Теперь я изменил класс подпись

public class Person<T extends Man>{}

И я больше не могу создать человек типа строки. Почему это случилось?

Потому что писать Person<T extends Man> вы указали, что параметр типа T человеку необходимо расширить Man (который также позволяет ему быть Man). Таким образом, если Milkman и Postman все продлить Man, то Person<Milkman>, Person<Postman> и Person<Man> все допустимые типы, но Person<String> нет, потому что String не распространяется Man.

public class Person<Man> extends AliveBeing<Man>{}

Почему компилятор только путаются Человека в человеке?

Потому что в этой декларации, вы используете Man, как большинство людей будут использовать T или E - то есть, это параметр типа, а не фактический класс. Вы делаете общий класс Person, где Man может быть заменен любым типом.

Предупреждение о компиляторе говорит, что при этом вы маскируете фактическое определение класса Man, которое теперь не может использоваться в определении общего класса Person. Это почти наверняка не то, что вы намеревались сделать, поэтому компилятор предупреждает вас.

+0

хм .. спасибо .. так теперь им любопытно .. как я пишу общий класс, который принимает только Man как общий тип? – DJR

+0

Что это значит? Как это универсально, если единственным возможным значением общего параметра является «Человек»? Или вы хотите, чтобы вы хотели что-то вроде «public class Person extends AliveBeing », который НЕ является универсальным классом, хотя он расширяет общий класс? –

+0

emm..Подумайте об этом. – DJR

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