【问题标题】:Pass Generic Object type in a class [duplicate]在类中传递通用对象类型[重复]
【发布时间】:2014-02-04 22:35:21
【问题描述】:

我已经问过了,这是一个混乱的描述,所以:

我有课

private Class MyClass<T extends SomeClass> //where  SomeClass is an abstract class
{
    SomeClass T=new SomeClass(); //Something like that but which works
}

我想以某种方式实例化 T 或调用它的方法,也许使用强制转换,因为 SomeClass 是抽象的,上面是无效的

【问题讨论】:

  • 你不能实例化一个抽象类。如果您要实例化一个具体的实现,那么您需要弄清楚您要实例化的具体实现。
  • 他们有公共课程 Abc 我也有类似的但
  • 我试图使这个通用。我只需要访问在抽象类中实现的方法。这就是我想要的

标签: java generics abstract-class


【解决方案1】:

首先,正确的类定义是

public class MyClass<T extends SomeClass> { }

private class MyClass<T extends SomeClass> { } 

如果这个类是一个内部类。 T 将被替换为某种类型。这意味着

SomeClass T =new SomeClass(); // this T is not the T from class definition

在上面的行中,您正在尝试创建抽象类的实例 - 这是不可能的!

创建扩展SomeClass的类并实现抽象方法(如果有),然后您可以创建一个实例SomeClass sc = new MyNewClassWhichExtendsSomeClass()

【讨论】:

    【解决方案2】:

    java tutorials 有一个很好的解决方案

    /**
     * Generic version of the Box class.
     * @param <T> the type of the value being boxed
     */
    public class Box<T> {
        // T stands for "Type"
        private T t;
    
        public void set(T t) { this.t = t; }
        public T get() { return t; }
    }
    

    只需创建一个设置实例的方法

    private class MyClass<T extends SomeClass> { 
         private T t;
         public void set(T t) { this.t = t; }
         //or
         public MyClass(T t){
             this.t = t;
         }
         public void seriousBusiness(){
             SomeClass someClass = (SomeClass) t;
             someClass.someClassMethod();
         }
    } 
    

    【讨论】:

      【解决方案3】:

      编辑错误的答案,new T() 不起作用。

      如果您想访问抽象类中的方法,它们必须是静态的,例如:

      public static int getNumber() {
          return 1;
      }
      

      然后您可以通过以下方式访问它:

      SomeClass.getNumber();
      

      注意 SomeClass 不是变量名,而是类名!

      【讨论】:

      • SomeClass 是一个抽象类。如果我无法实例化它,我只需要访问它的一种方法
      • @user3270982 在 Java 8 中,您可以这样做:SomeClass::someMethod。
      猜你喜欢
      • 2013-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-08
      • 1970-01-01
      • 1970-01-01
      • 2012-07-20
      • 2011-08-28
      相关资源
      最近更新 更多