Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ractNoteItem>getPanelFromIndex(3); NotePaneln4=notelist.getPanelFromIndex(4);//可能会生成类强制转换异常_Java_Generics_Variables_Type Safety - Fatal编程技术网

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