public class Test {
public class A {}
public class B extends A {}
public class C extends B {}
public void testCoVariance(List<? extends B> myBlist) {
B b = new B();
C c = new C();
myBlist.add(b); // does not compile
myBlist.add(c); // does not compile
A a = myBlist.get(0);
}
public void testContraVariance(List<? super B> myBlist) {
B b = new B();
C c = new C();
myBlist.add(b);
myBlist.add(c);
A a = myBlist.get(0); // does not compile
}
}
Если Вы получаете URLConnection
объектное использование openConnection()
это на самом деле не начинает связываться с сервером. Этого не происходит, пока Вы не получаете поток от URLConnection()
. Когда Вы сначала получаете соединение, можно добавить/изменить заголовки и другие свойства соединения прежде на самом деле открыть его.
Жизненный цикл URLCONNECTION немного нечетен. Это не отправляет заголовки на сервер, пока Вы не получили один из потоков. Если Вы просто получаете входной поток затем, я полагаю, что он делает ПОЛУЧЕНИЕ, отправляет заголовки, то позволяет Вам считать вывод. Если Вы получаете поток вывода затем, я полагаю, что он отправляет его как POST, поскольку он предполагает запись данных в него (Вы, возможно, должны звонить setDoOutput(true)
чтобы поток вывода работал). Как только Вы получаете входной поток, поток вывода закрывается, и он ожидает ответа с сервера.
Например, это должно сделать POST:
URL myURL = new URL("http://example.com/my/path");
URLConnection conn = myURL.openConnection();
conn.setDoOutput(true);
conn.setDoInput(true);
OutputStream os = conn.getOutputStream();
os.write("Hi there!");
os.close();
InputStream is = conn.getInputStream();
// read stuff here
В то время как это сделало бы ПОЛУЧЕНИЕ:
URL myURL = new URL("http://example.com/my/path");
URLConnection conn = myURL.openConnection();
conn.setDoOutput(false);
conn.setDoInput(true);
InputStream is = conn.getInputStream();
// read stuff here
URLConnection
также сделает другие странные вещи. Если сервер указывает длину содержания затем URLConnection
сохранит базовый входной поток открытым, пока он не получает так много данных даже при явном закрытии его. Это вызвало много проблем для нас, поскольку это сделало завершение работы нашего клиента чисто немного трудно, как URLConnection
сохранил бы сетевое соединение открытым. Это, вероятно, вероятно, существует, даже если Вы просто используете getStream()
все же.
Нет это не делает. Но если протоколом URL будет HTTP, то Вы получите a HttpURLConnection
как эхо-сигнал. Этот класс имеет a setRequestMethod
метод для определения, какой метод HTTP Вы хотите использовать.
Если Вы хотите сделать более сложный материал, Вы - вероятно, более обеспеченное использование библиотеки как Джакартский HttpClient.