鉴于AGenericClass如下:
public class AGenericClass<T> {
T subject;
public void setSubject(T subject) {
this.subject = subject;
}
}
Run Code Online (Sandbox Code Playgroud)
变量a,b和c之间有什么区别?
AGenericClass<String> a = new AGenericClass<>();
AGenericClass<?> b = new AGenericClass<String>();
AGenericClass c = new AGenericClass<String>();
a.setSubject("L"); // OK.
b.setSubject("M"); // Error: setSubject(capture<?>) cannot be
// applied to (java.lang.String)
c.setSubject("N"); // Warning: Unchecked call to 'setSubject(T)'
// as a member of raw type 'AGenericClass'
Run Code Online (Sandbox Code Playgroud)
a b和c all都是在没有IDE控制的情况下声明的,但是在setSubject调用时它们的行为都不同.
我试图理解有界类型,而不是完全理解它们的观点.
在https://docs.oracle.com/javase/tutorial/java/generics/bounded.html上有一个有界泛型的例子,它提供了这个用例:
public class NaturalNumber<T extends Integer> {
private T n;
public NaturalNumber(T n) { this.n = n; }
public boolean isEven() {
return n.intValue() % 2 == 0;
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
如果要限制可以作为参数化类型的类,为什么不要忘记参数化,并且具有:
public class NaturalNumber {
private Integer n;
public NaturalNumber(Integer n) { this.n = n; }
public boolean isEven() {
return n.intValue() % 2 == 0;
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
然后,任何扩展/实现Integer的类都可以与此类一起使用.
另外,还有一个问题:当Java Integer类最终时,T扩展Integer是如何在第一个例子中扩展的?
谢谢.
我正在尝试用MVP和Dagger建立一个应用程序,
该视图是一个Activity其中实现了一个图界面.
public class OverviewActivity extends AppCompatActivity implements OverviewContract.View {
@Inject OverviewPresenter presenter;
@BindView(R.id.history_days) ListView HistoryLabels;
@BindView(R.id.history_events) ListView HistoryEvents;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_overview);
ButterKnife.bind(this);
DaggerOverviewComponent.create().inject(this);
}
@Override
public void showHistory(List<Exercise> history) {
// ...
}
@Override
public void updateScoreSlider(float value) {
// ...
}
@OnClick(R.id.add_event_button)
public void addEvent(View v){
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
该演示看起来像这样
public class OverviewPresenter implements OverviewContract.Events {
OverviewContract.View view;
public OverviewPresenter( OverviewContract.View overviewView ) {
view = …Run Code Online (Sandbox Code Playgroud)