Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.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如何转换为泛型类型_Java_Generics_Casting - Fatal编程技术网

Java如何转换为泛型类型

Java如何转换为泛型类型,java,generics,casting,Java,Generics,Casting,这是我的班级结构 public abstract class SuperClass public class A extends SuperClass public class B extends SuperClass 现在我有一个框架,它将显示a元素的列表或B元素的列表,为了不重复代码,我希望使它尽可能的通用。 我的想法是将框架的元素类保存在字段中: public class MyFrame extends Frame { private final Class type; //

这是我的班级结构

public abstract class SuperClass

public class A extends SuperClass

public class B extends SuperClass
现在我有一个框架,它将显示a元素的列表或B元素的列表,为了不重复代码,我希望使它尽可能的通用。 我的想法是将框架的元素类保存在字段中:

public class MyFrame extends Frame {
    private final Class type; // type of the elements i'm going to display
    private final DefaultListModel list; // elements to show in a SelectionList

    public <T extends SuperClass> MyFrame(final List<T> elementsToDisplay, Class<T> type) {
         this.list = createListModel(elementsToDisplay);
         this.type = type;
    }
公共类MyFrame扩展了Frame{
私有final类类型;//我将要显示的元素的类型
private final DefaultListModel list;//要在SelectionList中显示的元素
公共MyFrame(最终列表元素STODISPLAY,类类型){
this.list=createListModel(elementsToDisplay);
this.type=type;
}
现在可以像这样称呼smth了

List<A> list = new LinkedList<>(...);
MyFrame frame = new MyFrame(list, A.class);
List List=newlinkedlist(…);
MyFrame=新的MyFrame(列表,A.class);
我的问题是如何使用字段type,例如,当在框架中选择一个项目时,我想将其转换为type类,但我不知道如何使用。以下几行是伪代码

<T extend SuperClass> foo(T item) { ... }

// ----

Object selectedItem = list.get(selectionList.getSelectedIndex());
[type.class] castedItem = type.cast(selectedItem);
foo(castedItem);  
foo(T项){…}
// ----
Object selectedItem=list.get(selectionList.getSelectedIndex());
[type.class]castedItem=type.cast(selectedItem);
傅(卡斯特迪姆);

如何将对象强制转换为持有类型的类?

如果我正确理解了您的问题,那么使用泛型的主要原因是为了避免在方法实现中强制转换,在方法实现中,您知道需要什么类型的对象,您不会使用
,而是使用
,以便某些类知道它s要使用的泛型类型。如果要使用
保留该方法,则必须检查该方法中的类实例,并决定要转换的类型。f e

if( object instanceof A)
 ((A)object).somethinkA();

else if(object instanceof B)
 ((B)object).somethinkB();

else
.....
如果您的目标真的是通过“使其尽可能通用”(sic)来最小化代码重复,那么为什么不这样做呢

class MyFrame<T extends SuperClass> {
    private final DefaultListModel list; 

    public MyFrame(final List<T> elementsToDisplay) {
        this.list = createListModel(elementsToDisplay);
    }
}
类MyFrame{
私人最终违约清单模型清单;
公共MyFrame(最终列表元素显示){
this.list=createListModel(elementsToDisplay);
}
}

不过,我要提醒您,使用泛型很容易过火(尤其是在您学会使用泛型之后:),这很可能就是其中之一。另外:根据一般经验,任何时候当您发现自己将泛型类的类型存储为该类的字段时,您都应该将其视为一个危险信号,您可能需要重新检查您的设计。

您可能正在寻找
instanceof
运算符,或者我不知道您在说什么关于…你为什么要将它转换为那种类型?我想你必须进一步挖掘Java泛型…将MyFrame更改为MyFrame将是一个很好的开始。你是对的,我不想“使它尽可能的通用”,对此表示歉意。是的,我在类声明中遗漏了这一点(这就是我为什么生气的原因))我注意到你的建议是绝对正确的。