java变量可以是无界的通配符吗?

时间:2016-09-07 16:09:35

标签: java variables object generics

例如,变量可以是这样的:

aboutme.XML

没有抛出错误,或者没有执行此操作?
一个如何有用的例子是这样的:

public <? extends Foo> FooExtension = new FooAugmentation();

主代码:

public class Human{
    private String localName;
    private <? extends Animal> FavoriteAnimalInstance;
    public Human(String name, <? extends Animal> fav){
        localName=name;
        FavoriteAnimalInstance = fav;
    }
    public <? extends Animal> getFavoriteAnimal(){
    return FavoriteAnimalInstance();
    }
}

或者我是否比那更容易使事情复杂化?

3 个答案:

答案 0 :(得分:2)

由于讨论开始失控......

您的代码如果有效,将导致人类对象拥有最喜欢的动物。但是Human无法告诉编译器,它是什么特定类型的动物,因为它所知道的只是&#34;延伸Animal(或Animal本身的东西)&#34;

实际上,它与......相同。

private Animal animal;

显然,你不想在那里对你的动物进行硬编码......

private Seymore favoriteAnimalInstance;

所以,唯一真正的选择&#34;你有,正在让人类的实例知道最喜欢的动物是什么......

public class Human<A extends Animal> {

   private A favoriteAnimal;

   public A getFavoriteAnimal(){
      return favoriteAnimal;
   }
}

...
public static void main(String[] args) {

   Human<Seymour> fry = new Human<Seymour>();
   // etc.
   boolean petrified = fry.getFavoriteAnimal().isPetrifiedInDiamondium();
}

除此之外?没有多少选择,因为编译器需要先知道对象的类型,然后才能调用它上面的方法。如果编译器只知道&#34; Animal&#34;,那么你只有动物方法,即使运行时的实际对象极其复杂并且有许多其他方法。

是的,您可以反思在运行时分析对象并调用方法等等 - 但请相信我,这不是一个好主意,并且它不能解决这个问题。

哦,请用小写字母开始你的变量名,谢谢。另外&#34;实例&#34;这里非常多余,因为一切都不是一个类,显然是一个实例,所以它实际上并没有在这里添加任何有意义的东西。

答案 1 :(得分:0)

我认为你不应该把事情变得复杂,显然你可以把你的对象持有者作为父母,它会做同样的事情。我知道泛型很棒,但我想不是在这种情况下。

答案 2 :(得分:-2)

您已撰写公开<? extends foo> FooExtension。变量类型声明在哪里。 <>用于通用声明。