Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.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 - Fatal编程技术网

在Java中创建新的通用对象

在Java中创建新的通用对象,java,generics,Java,Generics,我正在尝试编写一组用户界面,对多个类进行类似的操作,这些类都扩展了一个抽象类类别:HouseCography扩展了类别,CarCategraphy扩展了类别 大多数代码仅通过使用多态性就可以正常工作,但有一部分我需要创建扩展类别的新实例 Obj foo = new HouseCategory(a, b, c) 我怎样才能使这适用于类别的所有子类它们都有相同的构造函数参数。我对泛型了解不多,但是我是否可以将UI类定义为 public class UserInterface <T exten

我正在尝试编写一组用户界面,对多个类进行类似的操作,这些类都扩展了一个抽象类类别:HouseCography扩展了类别,CarCategraphy扩展了类别

大多数代码仅通过使用多态性就可以正常工作,但有一部分我需要创建扩展类别的新实例

Obj foo = new HouseCategory(a, b, c)
我怎样才能使这适用于类别的所有子类它们都有相同的构造函数参数。我对泛型了解不多,但是我是否可以将UI类定义为

public class UserInterface <T extends Category> extends JFrame {
公共类用户接口扩展JFrame{
或者可能

public class UserInterface  extends JFrame {
     public UserInterface(Class<T extends Category> clazz) {
公共类用户接口扩展JFrame{
公共用户接口(clazz类){
从那里开始建造? 非常感谢你的帮助

编辑:另外,是否可以从泛型类获取静态字段?
我不希望有一个语句检查“if(clazz instanceof houseCography)name=houseCography.name”,因为可能有数百个类。

由于类型擦除,泛型不能真正帮助您解决这个问题。在运行时,您的代码不“知道”类型参数的值

一种方法是使用工厂模式。为每个类别创建一个工厂类,让它们都实现一个公共工厂接口(可能是CategoryFactory)。然后将工厂对象提供给UserInterface,而不是class对象

另一种方法是使用反射来调用类对象上的构造函数。我不喜欢这种方法,因为它会抛出编译时检查窗口,但它会涉及在类上使用getConstructor方法。

引入一个新工厂来创建类别对象或用户界面。工厂需要无论何时添加新类别,都可以进行扩展,但这应该不是什么大问题:

public class CategoryFactory {
  public static enum Type {HOUSE, CAR}

  public static Category createCategory(Type type, Param a, Param 2, Param b) {
    if (type == null) return null;

    switch(Type) {
      case HOUSE: return new HouseCategory(a,b,c);
      case CAR: return new CarCategory(a,b,c);
    }
    return null; // or throw exception -> tells, that a new enum is not handled yet
  }
}

然后,如果您
保护类别子类中的构造函数,并将这些子类和工厂放在一个包中,则很难绕过工厂。

将类传递给接口。使用反射调用构造函数并访问名称字段。但最好使用子类可以重写:

/** subclass must have the default constructor */
abstract class Category
    abstract void init(a, b, c);
    abstract String name();

class HouseCategory extends Category
    void init(a, b, c){ ... }
    String name(){ return "House"; }

class UserInterface
    UserInterface(clazz)
         Category foo = (Category)clazz.newInstance();
         foo.init(a,b,c);
         String name = foo.name();

这是一种奇怪的方式。为什么不让枚举成为工厂?@Tom-基于枚举的工厂更容易理解,还是更漂亮?这次我决定帮助为给定的需求提供一个简单的解决方案。@Andread_D实现代码更容易使用。另外,这个问题还有一个关于静态fie的编辑lds,我想我们可以看到它的发展方向。OP-@Andreas_D@Tom。我理解你发布Andreas_D的课程,这对我来说似乎是一个很好的解决方案。我不明白你所说的“让Enum成为工厂”是什么意思,你能详细说明吗?不,这里不需要反思。不要这样做!