实例化一个泛型类型的对象与同一类型作为它的超

问题描述:

我想知道是否有可能创建一个是通用型与同类型的类它包含在的对象。实例化一个泛型类型的对象与同一类型作为它的超

例如,考虑这个对象

public class Foo<T> { 

    private T variable; 

    Foo() { 

    } 
} 

现在考虑这个

public class Bar<T> { 

    private Foo foo; 

    Bar() { 
     foo = (T) new Foo(); 
    } 
} 

我想酒吧类中的Foo对象的数据类型是相同的数据类型栏instantiat编辑为。

+2

这很杂乱。第二个例子,你试图将'Foo'实例赋值给'T'类变量?这是行不通的。请修改您的示例/问题 –

+3

'new Foo();' - 您正在使用不存在的无参数构造函数,并且您正在实例化一个原始类型。目前还不清楚你想要做什么。 – Eran

Foo中的构造函数需要一个参数;但你可以这样做:

public class Bar<T> { 

    private Foo<T> foo; 

    Bar(T x) { 
     foo = new Foo<T>(x); 
    } 
} 

我不确定我是否正确理解你,但是你想要这样的东西吗?

 public class Bar<T> extends Foo<T> { 

      private Foo<T> foo; 

      Bar() { 
       foo = new Foo<T>(); 
      } 
     } 
+0

在回答问题之前,请提出一个明确的问题!这里没有人能读懂你的想法。 – Duke

是的,你可以这样做,它会工作。但是你需要有正确的开发构造函数来处理数据类型。

程序的输出是:

class java.lang.Integer 
class java.lang.String 

正如你可以看到FOO变量的数据类型是一样的酒吧对象的数据类型。

而你在程序中犯了一个错误,在Bar类中应该有一个重载的构造函数。

package test; 

public class test { 

    public static void main(String[] args) { 
     Bar<Foo> integerBar = new Bar(3); 
     Foo<Integer> fooIntegerObject = (Foo) integerBar.getFoo(); 

     Bar<Foo> stringBar = new Bar("hello"); 
     Foo<String> fooStringObject = (Foo) stringBar.getFoo(); 

     System.out.println(fooIntegerObject.getVariable().getClass()); 
     System.out.println(fooStringObject.getVariable().getClass()); 

    } 
} 

class Foo<T> { 

    private T variable; 

    Foo(T x) { 
     variable = x; 
    } 
    public T getVariable() { 
     return variable; 
    } 

} 

class Bar<T> { 

    private T foo; 

    Bar(T x) { 
     foo = (T) new Foo<T>(x); 
    } 
    public T getFoo() { 
     return foo; 
    } 

} 

基于更新后的问题,下面的工作:

class Bar<T extends Foo<T>> { 
    private Foo<T> foo; 

    Bar() { 
     foo = new Foo<T>(); 
    } 
} 

注意,你不应该使用原始类型Foo