Java ractNoteItem>getPanelFromIndex(3); NotePaneln4=notelist.getPanelFromIndex(4);//可能会生成类强制转换异常
如果我正确理解了这个问题,那么您有一个Java ractNoteItem>getPanelFromIndex(3); NotePaneln4=notelist.getPanelFromIndex(4);//可能会生成类强制转换异常,java,generics,variables,type-safety,Java,Generics,Variables,Type Safety,如果我正确理解了这个问题,那么您有一个NotePanel类,它有一个note item成员。此注释项是AbstractNoteItem的子类。但是您不想给note项类型AbstractNoteItem,因为您希望直接访问子类方法 现在,如果所有这些子类方法具有相同的名称和相同的签名(在整个层次结构中),那么您根本不需要泛型;普通的多态性适合你 但是如果子类方法非常不同,那么您需要的是单独的NotePanel类,每种类型的注释项对应一个类。在您的问题中,您似乎希望使用泛型生成它们。这在Java中是
NotePanel
类,它有一个note item成员。此注释项是AbstractNoteItem
的子类。但是您不想给note项类型AbstractNoteItem
,因为您希望直接访问子类方法
现在,如果所有这些子类方法具有相同的名称和相同的签名(在整个层次结构中),那么您根本不需要泛型;普通的多态性适合你
但是如果子类方法非常不同,那么您需要的是单独的NotePanel
类,每种类型的注释项对应一个类。在您的问题中,您似乎希望使用泛型生成它们。这在Java中是不可能的,因为擦除。正如另一个答案中提到的,C++泛型将创建多个类,但在java中没有得到这个。
但是如果这些独立的NotePanel
类在每个AbstractNoteItem
子类中都有调用不同方法的方法,那么我认为,您确实需要编写独立的NotePanel
子类!如果您需要的话,这种类的并行层次结构并没有那么糟糕
如果按此方法进行,则将对
NoteItem
构造函数(您无法使用的构造函数)的调用替换为创建正确类型的NoteItem
子类的工厂方法。如果我正确理解此问题,则您有一个具有note item成员的NotePanel
类。此注释项是AbstractNoteItem
的子类。但是您不想给note项类型AbstractNoteItem
,因为您希望直接访问子类方法
现在,如果所有这些子类方法具有相同的名称和相同的签名(在整个层次结构中),那么您根本不需要泛型;普通的多态性适合你
但是如果子类方法非常不同,那么您需要的是单独的NotePanel
类,每种类型的注释项对应一个类。在您的问题中,您似乎希望使用泛型生成它们。这在Java中是不可能的,因为擦除。正如另一个答案中提到的,C++泛型将创建多个类,但在java中没有得到这个。
但是如果这些独立的NotePanel
类在每个AbstractNoteItem
子类中都有调用不同方法的方法,那么我认为,您确实需要编写独立的NotePanel
子类!如果您需要的话,这种类的并行层次结构并没有那么糟糕
如果您使用此方法,则将对
NoteItem
构造函数(您无法使用的构造函数)的调用替换为创建正确类型的NoteItem
子类的工厂方法。您可能知道它不起作用的原因:键入erasure.)NotePanel
需要通用的原因是什么NotePanel
需要扩展AbstractNoteItem
的类型,因为AbstractNoteItem
包含一个方法getTypeName()
,该方法返回一个人类可读的字符串,该字符串用作JLabel
文本的一部分。有没有一种方法可以通过传递一个类来实现这一点?你可能知道为什么它不起作用:键入擦除。:)NotePanel
需要通用的原因是什么NotePanel
需要扩展AbstractNoteItem
的类型,因为AbstractNoteItem
包含一个方法getTypeName()
,该方法返回一个人类可读的字符串,该字符串用作JLabel
文本的一部分。有没有一种方法可以通过只传递一个类新的NotePanel来实现这一点谢谢,但是没有,这不会有帮助,因为我需要一个特定于(被)每个子类的访问方法,所以如果我使用新的NotePanel
,该方法将始终指向AbstractNoteItem
中的方法,而不是它的子类(对吗?)。而且我习惯了C++,所以这可能是为什么这不起作用:为了访问子类方法,你需要一些地方去低落。但目前,您的返回方法只是普通的NotePanel,因此无论谁调用您都无法访问该子类。您需要在某个地方参数化返回类型。new NotePanel谢谢,但不,这不会有帮助,因为我需要特定于每个子类(由每个子类覆盖)的访问方法,因此如果我使用new NotePanel
,该方法将始终指向AbstractNoteItem
中的方法,而不是它的子类(对吗?)。而且我习惯了C++,所以这可能是为什么这不起作用:为了访问子类方法,你需要一些地方去低落。但目前,您的返回方法只是普通的NotePanel,因此无论谁调用您都无法访问该子类。您需要在某个地方参数化返回类型。这里发生了什么?我不明白。如何在方法中接受类型参数?人们如何称呼这种方法?我不希望NoteListModel
成为泛型类型。这里有一个关于泛型方法的链接。我给出了一些调用示例。NoteListModel不是泛型类型-只是一个方法。这里发生了什么?我不明白。如何在方法中接受类型参数?人们如何称呼这种方法?我不希望NoteListModel
成为泛型类型。这里有一个关于泛型方法的链接。我给出了一些调用示例。NoteListModel不是泛型类型,只是一种方法;然而,问题是,即使方法签名相同,方法也是静态的——这难道不意味着它们不是被覆盖的,而是隐藏的吗?将NotePanel
类和
public class NoteList extends JList {
...
public class NoteListModel extends AbstractListModel {
...
public NotePanel getPanelFromIndex(int index) {
if (!indexExists(index)) {
// FYI, indexExists(int) works fine
return null;
} else {
AbstractNoteItem item = getElementAt(index);
// FYI, getElementAt(int) works fine
assert (item != null);
Class<?> itemClass = item.getClass();
return (new NotePanel<itemClass> (item));
}
}
}
}
new NotePanel<AbstractNoteItem> (item)
public class NoteList extends JList {
...
public class NoteListModel extends AbstractListModel {
...
public < T extends AbstractNoteItem > NotePanel < T > getPanelFromIndex(int index) {
if (!indexExists(index)) {
// FYI, indexExists(int) works fine
return null;
} else {
T item = ( T ) ( getElementAt(index) ) ; // this should generate a warning
// FYI, getElementAt(int) works fine
assert (item != null);
// not needed // Class<?> itemClass = item.getClass();
return (new NotePanel<T> (item));
}
}
} }
class NoteItemImpl extends AbstractNoteItem { ... stuff ... }
Notelist notelist ;
// implicit type argument specification
NotePanel < AbstractNoteItem > n1 = notelist . getPanelFromIndex ( 1 ) ;
NotePanel < NoteItemImpl > n2 = notelist . getPanelFromIndex (2 ) ; // may generate class cast exception
// explicit type argument specification
NotePanel < AbstractNoteItem > n3 = notelist . < AbstractNoteItem > getPanelFromIndex ( 3 ) ;
NotePanel < NoteItemImpl > n4 = notelist . < NoteItemImpl > getPanelFromIndex ( 4 ) ; // may generate class cast exception