2017-08-09 49 views
2

正在对一些简单的使用具有两个构造冲突的构造器在运行时泛型类

public class GenericObject<M> { 

    private String string; 
    private M generic; 

    public GenericObject(String string) { 
     this.string = string; 
    } 

    public GenericObject(M generic) { 
     this.generic= generic; 
     this.string = "default"; 
    } 

} 

然后在一个点上,我需要一个GenericObject<String>

GenericObject<String> obj = new GenericObject<>("randomString"); 

泛型类和后来我发现在调试时使用String构造函数而不是预期的通用函数。

但是我可以改变我想这个类,所以它不是解决问题,但我想知道如果有一种方法来暗示在运行时在这种情况下要使用的构造

+6

使用'String'构造函数是因为它比用于泛型调用的'Object'构造函数更精确。我会说你在这种情况下设计了这个班。 – Kayaman

+4

我至少在几次之前见过这个问题。我认为JLS在不确定要调用哪种方法的情况下会提到更具体的版本。在这种情况下,'String'比泛型更具体,所以前者被调用。 –

+0

我看到... thx的快速回答!马上改变设计 – Zeromus

回答

3

让我们看看字节码:enter image description here

由于类型擦除的第二构造函数变得public GenericObject(Object generic)并作为用户Kayaman和Tim Biegeleisen表示,String更具体然后Object,因此第一构造函数被调用。

+1

只是为了完成 - 这里从oracle的一些例子:https://docs.oracle.com/javase/tutorial/java/generics/genTypes.html – Silk0vsky