【问题标题】:How to pass an Object of a Class that implements an Interface with just knowing the Class of the Interface to a Method and add it to an ArrayList?如何将实现接口的类的对象传递给仅知道接口的类的方法并将其添加到ArrayList?
【发布时间】:2017-11-05 15:22:17
【问题描述】:

假设我有一个接口和多个实现此接口的类:

public interface MyInterface {
   public String getString();
   public String getAnotherString();
}

现在我有了实现这个接口的类:

public class MyClass1 implements myInterface {
   @Override
   public String getString() {
       return "A String";
   }
   @Override
   public String getAnotherString() {
      return "foo";
   }
}

还有:

public class MyClass2 implements myInterface {
    @Override
    public String getString() {
        return "Another String";
    }
    @Override
    public String getAnotherString() {
       return "bar";
    }
}

我怎样才能让方法接受实现myInterface 的类的对象呢?

public <T extends MyInterface> void aMethod(T object) {
    objects.add(object); //⚡ doesn't work
}

这可行,但它不允许我将这些对象添加到我当时声明的 ArrayList 中:

ArrayList<? extends MyInterface> objects = new ArrayList<>();

我做错了什么? :/

【问题讨论】:

  • 为什么要这样做?为什么你不能只使用ArrayList&lt;myInterface&gt; objects
  • 为什么不public void aMethod(myInterface obj)ArrayList&lt;myInterface&gt;
  • 你知道oyu有两个类叫myClass1吗?另外,请尊重 Java 命名约定:类和接口应该用UpperCamelCase 编写。
  • 天哪.. 我可以发誓这是我尝试的第一件事。现在我确实花了 2 个小时的研究而没有注意到这一点。但感谢您指出这一点。 :)
  • 简短的回答是永远不要使用? extendssuper。在一些复杂的情况下需要它们,但是,IMO,大多数情况可以而且应该重新设计。

标签: java generics arraylist


【解决方案1】:

根据 的泛型? extends MyInterface 只允许使用 getter

ArrayList<? extends MyInterface> objects = new ArrayList<>();
you can only do get of type MyInterface and Object
MyInterface myInterace = objects.get(0);
Object myInterace = objects.get(0);

您可以使用ArrayList&lt;MyInterface&gt; objects = new ArrayList&lt;&gt;();

现在假设如果允许添加到 MyInterface,那么通过一个简单的示例可能会发生什么错误

Long longValue = 20L; 
List<Long> longList = new ArrayList();
longList.add(longValue);

Integer i =10;
List<? extends Number> sNumber = longList ;// longList can be assigned to ? extends Number
sNumber.add(i); // if this was allowed
longValue = longList.get(1);   // we will get an exception (class cast exception)

因此编译器不允许该设置器

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多