Я занимаюсь дженериками, и я сделал следующее.Тип параметра 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>
?
хм .. спасибо .. так теперь им любопытно .. как я пишу общий класс, который принимает только Man как общий тип? – DJR
Что это значит? Как это универсально, если единственным возможным значением общего параметра является «Человек»? Или вы хотите, чтобы вы хотели что-то вроде «public class Person extends AliveBeing», который НЕ является универсальным классом, хотя он расширяет общий класс? –
emm..Подумайте об этом. – DJR