在Start Class中我定义了两个对象并将信息作为参数传递给这些对象构造函数我而不是在Person类中创建两个实例变量,并在constrcutor中实例化两个变量为什么我无法调用{{1}来自getName()
的方法?如何从class A
调用getName()
方法?
class A()
答案 0 :(得分:3)
您已经创建了一个由两个类型A,B参数化的泛型类Person。这些只是“占位符”,与您的A,B类没有任何共同之处。从Person类中删除类型,它应该工作。这意味着您必须像这样定义Person:
public class Person {
//the rest of you code here
}
BTW:你应该在这里得到一个编译器警告,“类型参数A隐藏了A类”。
答案 1 :(得分:1)
你可以简单地这样做
A a=new A();
String name=a.getName();
答案 2 :(得分:1)
问题是你已声明getName
函数具有默认访问权限,即package-private,只需在class A
中使用public
修饰符声明函数,以防这些类在不同的包中,
public String getName()
答案 3 :(得分:1)
如果班级Person
和班级A
位于不同的套餐中,则需要将getName()方法设为 public 。它目前具有默认访问权限(包访问权限)。因此,它不可见并显示undefined。像这样改变
public String getName() {
return this.name;
}
答案 4 :(得分:1)
这是因为Person类不了解类A
或B
。您已为类Person<A, B>
指定了泛型类型参数 - 此处A
和B
并不表示A类或B类,它们是其他类类型的占位符,其中包含“变量 - 名称“A和B.
当你说的时候
Aa;
B bb;
在您的类中,这意味着在三角括号中创建类的对象时,A和B将替换为您指定的类型。由于java是强类型语言,因此无论您稍后指定何种类型,它都应该保证您的代码能够正常工作。它失败了,因为它没有任何保证您以后指定为参数的任何类型 - A将具有getName()方法。您可以通过声明只允许传递属于类A的子类的类型参数来提供保证:
公共类人{
T aa;
U bb;
人(T aa,U bb){
this.aa = aa;
this.bb = bb;
}
答案 5 :(得分:0)
class A {
public String name;
A(String name) {
this.name = name;
}
String getName() {
return this.name;
}
}
class B {
public int num;
public B(int a ) {
this.num = a;
}
int getNum() {
return this.num;
}
}
public class Start {
public static void main(String[] args) {
A objectA = new A("John");
B objectB = new B(24);
Person a = new Person(objectA, objectB);
a.getAge();
}
}
**class Person{**
A aa;
B bb;
Person(A aa, B bb) {
this.aa = aa;
this.bb = bb;
}
public void getAge() {
System.out.println(this.aa.getClass().getName());
System.out.println(this.bb.getClass().getName());
System.out.println(this.aa.getName());
}
}
无需更改方法的访问修饰符,因为您将导入A类。