【问题标题】:Instantiating a Type Parameter Without Passing an Object在不传递对象的情况下实例化类型参数
【发布时间】:2014-05-01 17:16:40
【问题描述】:

我的问题与this 问题非常相似。我希望能够实例化类型参数类型的对象,但也不需要传入“工厂”。我真的需要被包含在一个班级中。

public class myClass<E> {
    E someObject;

    public myClass(){
         someObject = new E();
    }
}

以前的解决方案需要将 myClass 的构造函数更改为具有工厂参数,然后调用它的构造函数,但出于我的目的,我不想修改从外部对 myClass 的任何调用。

【问题讨论】:

    标签: java oop type-parameter


    【解决方案1】:

    问题是你不知道E 是什么,也不知道如何构造它。它可以是任何类型(它是universally quantified)。您需要提供证据证明,无论E 是什么,它都可以真正构建。给定类型的“工厂”可以证明它可以做到这一点。

    想一想:如果我将Void 作为参数E 传递会怎样?您将如何构造一个 Void 类型的值?

    能够为所有E构造E 就像从无到有创造一些东西。这是逻辑上的不可能。 ∀E. E 是一个无人居住的集合。

    您真正想要的是让E 有一个界限,或者传递一个构造函数(工厂)作为E 在可构造对象集中这一事实的见证。

    【讨论】:

      【解决方案2】:

      不,如链接问题的答案中所述,您不能这样做。修改接口传入一个工厂对象。 (注意:Class 是一家糟糕的工厂。)

      【讨论】:

        【解决方案3】:

        您知道您的代码不起作用,并且您期望找到一个语法足够接近的解决方案。

        这个怎么样?

        //doesn't work. cannot make x.someObject a new String()
        //MyClass<String> x = new MyClass<String>();
        
        //this can work...
        MyClass<String> x = MyClass.neu(String.class);
        
        public class MyClass<E>
        {
            static public <T> MyClass<T> neu(Class<T> clazz){...}
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-10
          • 2019-03-27
          • 1970-01-01
          • 2014-09-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-07-25
          相关资源
          最近更新 更多